10

我目前正在尝试解决一个引用成分的简单食谱列表。

数据布局如下所示:

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 中为嵌套类型编写单独的解析器?

4

1 回答 1

15

只能通过 定义查询和突变的解析器root,即使这样也是不好的做法。我猜您正在使用 构建架构buildSchema,这通常是个坏主意,因为生成的架构将仅使用默认解析器

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

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

于 2018-02-26T12:22:41.487 回答