如何在一个类型中添加多个解析器(Apollo服务器)

时间:2019-03-10 19:44:06

标签: graphql apollo-server

我用过express-graphql,在那里我曾经做过类似的事情。

const SubCategoryType = new ObjectType({
  name: 'SubCategory',
  fields: () => ({
    id: { type: IDType },
    name: { type: StringType },
    category: {
      type: CategoryType,
      resolve: parentValue => getCategoryBySubCategory(parentValue.id)
    },
    products: {
      type: List(ProductType),
      resolve: parentValue => getProductsBySubCategory(parentValue.id)
    }
  })
});

这里我有多个解析器,id and name是直接从结果中获取的。并且类别和产品都有自己的数据库操作。等等。 现在,我正在apollo-server上工作,我找不到复制它的方法。

例如我有一个类型

   type Test {
    something: String
    yo: String
    comment: Comment
  }
   type Comment {
    text: String
    createdAt: String
    author: User
  }

在我的解析器中,我想将其拆分,例如这样的

text: {
    something: 'value',
    yo: 'value',
    comment: getComments();
}

注意:这只是我需要的代表。

1 个答案:

答案 0 :(得分:2)

您可以添加特定于类型的解析器来处理特定字段。假设您具有以下架构(基于您的示例):

type Query {
  getTest: Test
}
type Test {
  id: Int!
  something: String
  yo: String
  comment: Comment
}
type Comment {
  id: Int!
  text: String
  createdAt: String
  author: User
}
type User {
  id: Int!
  name: String
  email: String
}

我们还假设您具有以下数据库方法:

  • getTest()返回具有字段somethingyocommentId
  • getComment(id)返回一个具有字段idtextcreatedAtuserId
  • 的对象
  • getUser(id)返回具有字段idnameemail的对象

您的解析器将如下所示:

const resolver = {
  // root Query resolver
  Query: {
    getTest: (root, args, ctx, info) => getTest()
  },
  // Test resolver
  Test: {
    // resolves field 'comment' on Test
    // the 'parent' arg contains the result from the parent resolver (here, getTest on root)
    comment: (parent, args, ctx, info) => getComment(parent.commentId)
  },
  // Comment resolver
  Comment: {
    // resolves field 'author' on Comment
    // the 'parent' arg contains the result from the parent resolver (here, comment on Test)
    author: (parent, args, ctx, info) => getUser(parent.userId)
  },
}

希望这会有所帮助。