首页 文章

解析快速GraphQL中的嵌套数据

提问于
浏览
3

我目前正在尝试解决一个简单的食谱清单,其中包含对成分的参考 .

数据布局如下所示:

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,
}));

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

endpoints 有效,但是一旦我查询成分,就会返回此消息 "message": "Cannot return null for non-nullable field Ingredient.name.", 的错误 .

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

How do I write seperate resolvers for nested types in express-graphQL?

1 回答

  • 4

    只能通过 root 定义查询和突变的解析器,即使这样也是不好的做法 . 我'm guessing you'使用 buildSchema 重建你的架构,这通常是一个坏主意,因为the generated schema will only use default resolvers .

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

    执行上述操作非常痛苦,特别是如果您已经在字符串或文档中定义了架构 . 因此,另一种选择是使用graphql-tools'makeExecutableSchema,它允许您将这些解析器注入您正在尝试的类型定义中 . makeExecutableSchema 返回一个GraphQLSchema对象,因此您可以将其与现有代码一起使用(您不希望这样做) .

相关问题