Gatsby graphql 解析器查询未返回所有字段

Posted

技术标签:

【中文标题】Gatsby graphql 解析器查询未返回所有字段【英文标题】:Gatsby graphql resolver query not returning all fields 【发布时间】:2022-01-10 18:03:46 【问题描述】:

我有这个解析器查询,我在其中过滤所有降价条目以构建一个集合:

export const createResolvers = (createResolvers) => 
    const resolvers = 
        Query : 
            allPosts     : 
                type   : ["Post"],
                args   :  limit: `Int`, skip: `Int` ,
                resolve: async (source, args, context, info) => 
                    const  entries  = await context.nodeModel.findAll(
                        type : "MarkdownRemark",
                        query: 
                            limit : args.limit,
                            skip  : args.skip,
                            filter: 
                                fileAbsolutePath: 
                                    regex: "//collections/posts//"
                                
                            
                        
                    );

                    return entries;
                
            ,
        
    

它返回一个Post类型的集合:

    type Post implements Node @dontInfer 
        id: ID!
        html: String
        rawMarkdownBody: String
        fileAbsolutePath: String
        ...
    

我选择的MarkdownRemark 条目有一个html 字段,其中包含markdown 文件的html 输出。我可以在 Graphiql 游乐场/控制台中看到它。

当我使用allPosts 查询时,html 字段为空。我得到rawMarkdownBody 和其他字段,但没有得到html

有什么想法吗?

【问题讨论】:

【参考方案1】:

这里的问题是 createResolvers 转换器之后运行,因此在解析器运行时,MarkdownRemark 类型的其他节点已经添加了 html 字段。 p>

您可以改为在 createSchemaCustomization 中进行更改。例如,这样的事情(可能无法逐字使用,但想让您了解要点):

exports.createSchemaCustomization = async (
  actions:  createTypes ,
  schema,
) => 
  createTypes([
    schema.buildObjectType(
      name: "Query"
      fields: 
        allPosts: 
          type: ["Post"],
          args:  limit: `Int`, skip: `Int` ,
          resolve: async (source, args, context, info) => 
            // …       
          ,
        ,
      ,
    )
  ])

【讨论】:

我有时间对此进行了更长的调查,似乎 html 字段在第一次查询之前不会呈现,这就是为什么在我创建解析器时它返回 null 的原因。就我而言,问题是我构建了allPosts,然后对其进行查询,而不是在allMarkdownRemark 上进行查询,这会阻止markdownremark 生成html,因为没有针对它运行任何查询。一些见解:github.com/gatsbyjs/gatsby/issues/17045 @RomeoMihalcea 我不确定你的情况是否重要。如果您不需要查询 html 字段,则不必担心解析器在查询时动态创建它,您只需在备注插件运行之前注册架构更改。 它似乎不起作用或者我做错了。我创建了一个演示(来自一个玩具博客),您可以查看 node.js 文件。尝试使用buildObjectType 或使用createResolvers 进一步创建它。无论在哪里,html 字段都返回 null。感谢您抽出宝贵的时间 忘记添加 repo 文件:github.com/ciokan/surron-parts/blob/resolvers/…(这是在 resolvers 分支上)

以上是关于Gatsby graphql 解析器查询未返回所有字段的主要内容,如果未能解决你的问题,请参考以下文章

Gatsby 和 GraphQL - 如何在查询中过滤数组

来自 markdown 帖子的 Gatsby 图像未从 graphql 查询中显示

Graphql 查询结果在 UI 中正确返回,但数据在应用程序内显示为“未定义”

如何访问 Gatsby 中“file”或“allFiles”GraphQL 查询返回的文件的文本内容?

“无法读取未定义的属性‘节点’” - Gatsby/GraphQL/Prismic

返回 node-mysql 中 graphql 解析器函数的 mysql 查询