[英]Resolving nested data in express GraphQL
我目前正在尝试解决一个简单的食谱清单,其中包含对成分的参考。
数据布局如下所示:
type Ingredient {
name: String!
amount: Int!
unit: Unit!
recipe: Recipe
}
type Recipe {
id: Int!
name: String!
ingredients: [Ingredient]!
steps: [String]!
pictureUrl: String!
}
据我了解,我的解析器应如下所示:第一个解析配方,第二个解决配方中的配料字段。 它(根据我的理解)可以使用食谱提供的参数。 在我的配方对象中,成分由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中为嵌套类型编写单独的解析器?
只能通过root
定义查询和突变的解析器,即使这样也是不好的做法。 我猜你正在使用buildSchema
构建你的模式,这通常是个坏主意,因为生成的模式只会使用默认的解析器 。
在使用普通的GraphQL.js时,为诸如ingredients
类的字段定义解析器的唯一方法是不使用buildSchema
。 您可以以编程方式定义它(即定义GraphQLSchema及其使用的所有类型),而不是从字符串生成模式。
执行上述操作非常痛苦,特别是如果您已经在字符串或文档中定义了架构。 因此,另一种选择是使用graphql-tools的makeExecutableSchema ,它允许您将这些解析器注入到您尝试执行的类型定义中。 makeExecutableSchema
返回一个GraphQLSchema对象,因此您可以将它与现有代码一起使用(如果您不想,则不必将中间件更改为apollo-server)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.