【问题标题】:Resolving nested data in express GraphQL在 express GraphQL 中解析嵌套数据
【发布时间】:2018-08-05 16:46:06
【问题描述】:

我目前正在尝试解析一个包含成分参考的简单食谱列表。

数据布局如下所示:

type Ingredient {
  name: String!
  amount: Int!
  unit: Unit!
  recipe: Recipe
}

type Recipe {
  id: Int!
  name: String!
  ingredients: [Ingredient]!
  steps: [String]!
  pictureUrl: String!
}

据我了解,我的解析器应如下所示: 第一个解析配方,第二个解析配方中的成分字段。它可以(根据我的理解)使用 recipe 提供的参数。在我的食谱对象中,成分由 id (int) 引用,所以这应该是参数(至少我是这么认为的)。

var root = {
  recipe: (argument) => {
       return recipeList;
  },
  Recipe: {
    ingredients: (obj, args, context) => {
        //resolve ingredients
    }
  },

这些解析器像这样传递给应用程序:

app.use('/graphql', graphqlHTTP({
  schema: schema,
  graphiql: true,
  rootValue: root,
}));

但是,我的解析器似乎没有被调用。我希望在我的查询中查询时即时解析这些成分。

端点可以工作,但只要我查询成分,就会返回一条错误消息"message": "Cannot return null for non-nullable field Ingredient.name.",

当尝试在我的解析器中记录传入的参数时,我可以看到它从未被执行。不幸的是,当我像我一样使用 express-graphql 时,我找不到如何使用它的示例。

如何为 express-graphQL 中的嵌套类型编写单独的解析器?

【问题讨论】:

    标签: node.js express graphql graphql-js express-graphql


    【解决方案1】:

    只有查询和突变的解析器可以通过root 定义,即使这样也是不好的做法。我猜你正在使用buildSchema 构建你的架构,这通常是一个坏主意,因为the generated schema will only use default resolvers

    在使用普通 GraphQL.js 时,为 ingredients 之类的字段定义解析器的唯一方法是不使用 buildSchema。您可以通过编程方式定义它(即定义 GraphQLSchema 及其使用的所有类型),而不是从字符串生成架构。

    执行上述操作非常痛苦,尤其是如果您已经在字符串或文档中定义了架构。因此,另一种选择是使用 graphql-tools 的makeExecutableSchema,它可以让您将这些解析器注入到您的类型定义中,就像您尝试做的那样。 makeExecutableSchema 返回一个 GraphQLSchema 对象,因此您可以将其与现有代码一起使用(如果您不想将中间件更改为 apollo-server,则不必)。

    【讨论】:

    • 非常感谢!我使用了 makeExecutableSchema,为成分类型定义了一个自定义解析器,它立即工作。我真的很难弄清楚是什么原因造成的,所以感谢您的解释!
    • TBH 我什至不知道可以以编程方式构建模式 - 每个教程都显示了这个来自字符串方法的buildSchema。为什么他们甚至创建了从字符串构建它的选项?
    猜你喜欢
    • 2018-08-25
    • 2021-07-28
    • 2019-10-14
    • 2017-12-18
    • 1970-01-01
    • 2018-09-02
    • 2019-12-21
    • 2017-01-07
    • 2013-05-29
    相关资源
    最近更新 更多