2017-08-26 11 views
3

初めてGatsbyを試してみると嬉しいです。しかし、私は奇妙なGraphQLの問題に遭遇しました:Graphqlは任意に割り当てられたマークダウンフロントマターデータ(一部ではありません)を無視します

私はマークダウンファイルからコンテンツを引き出すためにgatsby-source-filesystemとgatsby-transformer-remarkプラグインを使用しています。

フロントマターのデータがすべて同じではありません(titleを除く)。いくつかはdate文字列(ブログの投稿)を持っています、同じtag配列を持って、いくつかはgalleryオブジェクトを持っています。

ここで問題になるのは、この任意に割り当てられたフロントマターデータの一部がGraphQLで利用可能であり、一部がそうでないことです。たとえば、私は日付を照会しようとすると、私はいつも "GraphQLエラー不明フィールドdateタイプfrontmatter_2"を取得します。一方、私はタグを照会すると、私はそれらを持っている人のために1つとtags: nullを含むそれらの項目のためのタグ配列を得ます。

ここで問題は何ですか?ノードに存在しないフィールドの値として常に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

GraphQLから少数のフィールドが散在しているような場合は、thisというバグが発生する可能性があります。

しかし、具体的な質問に答えるには、空のフィールドに常に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

ありがとう!私はすぐにこれをテストし、それが動作すれば答えとしてマークします。再度、感謝します! –

関連する問題