2017-08-26 47 views
3

第一次嘗試蓋茨比和它的一個很高興。但是我遇到了一個奇怪的問題GraphQL:GraphQL忽略了一些(但不是全部)任意分配降價frontmatter數據

我使用的蓋茨比源文件系統和蓋茨比,變壓器備註插件,從降價文件中提取內容。

的frontmatter數據不是在所有這些(除了title)的相同。一些有date字符串(博客文章),同樣有一個tag數組,有一些有gallery對象。

現在的問題是,一些本人爲地賦予frontmatter數據的GraphQL可用,有些不是。例如,如果我試圖查詢日期,我總是會得到類型爲frontmatter_2的「GraphQL錯誤未知字段date」。而如果我查詢標籤,我會爲那些包含一個的項目獲取標籤數組,而對於那些不包含這些項目的項目則獲得標籤數組。

這裏有什麼問題?我如何總能得到null作爲節點中不存在的字段的值?

這也許注意到,這種行爲變化取決於我的降價文件的目錄結構。如果我移動它們,一些Frontmatter字段在GraphQL中變得可用,以前不是,反之亦然。它也發生了一些代碼更改通過HMR被推送後,一些字段變得可用 - 但是在我重新啓動Gatsby之後,儘管沒有觸及代碼之間,它們又一次消失了。

非常感謝您的幫助!

編輯

失敗敲我的頭這一段時間後,我使出確保所有降價frontmatter具有相同類型的字段相同。

我猜

TODO鏈接到文檔中的自動推理類型/場。

documentation的一部分就是關於這個問題。

當我有更多時間時,我想了解更多關於GraphQL及其在Gatsby中的工作原理。任何指針讚賞。

+0

不是一個直接的答案,但檢查GraphiQL與蓋茨比,這是一個巨大的幫助,瞭解什麼時候可用的數據。 http:// localhost:8000/___ graphql – chmac

+0

感謝您的評論。我瞭解GraphiQL,這確實非常有幫助。然而,我的問題是關於gatsby-transformer-remark如何解析前端並決定哪些數據在節點接口中如何結束。 - 自從我問這個問題以來,有很多更新。也許它已被修復......我很快就要再試一次。 –

+0

Gatsby根據可用數據「推斷」GraphQL模式。 [這](https://github.com/gatsbyjs/gatsby/issues/3913)問題表明,有些領域,如果不存在於每個記錄,可能偶爾會被丟棄。確保每個文檔都在每個文檔上的解決方法可能是最強大的解決方案,至少現在是這樣。 – chmac

回答

0

您可能會碰到this錯誤,其中有時候稀疏填充的字段似乎從GraphQL中遺漏。

但是,要回答您的具體問題,您如何確保您始終爲空字段獲得null。您可以通過使用onCreateNode掛鉤來完成此操作。這個鉤子被每個節點調用。

類似下面的僞代碼將實現自己的目標:

exports.onCreateNode = ({node, getNode, boundActionCreators}) => { 
    const { createNodeField } = boundActionCreators 

    if (_.get(node, 'internal.type') === `MarkdownRemark`) { 

    // Repeat this for each field 
    createNodeField({ 
     node, 
     name: 'date', 
     value: _.get(node, 'frontmatter.date', 'default date'), 
    }) 

    } 
} 

這將從frontmatter複製值fields,並確保它們總是存在的,如果他們不存在,一些默認值。您可以在node.internal.type上添加測試以過濾特定節點類型

注意:這是完全未經測試的,關閉袖口,僞代碼,請自擔風險!

+0

非常感謝!我會盡快進行測試,並將其標記爲答案。再次感謝! –

相關問題