合并Apollo Server的GraphQL解析器不能与Object.assign()一起使用

agm*_*984 2 schema resolver node.js graphql apollo-server

我正在为GraphQL API模块化我的架构,并尝试在不使用任何第三方库的情况下合并解析器。

有没有简单的方法可以做到这一点Lodash.merge()

Apollo文档说要使用Lodash之类的库来merge()模块化解析器。(http://dev.apollodata.com/tools/graphql-tools/generate-schema.html#modularizing

问题似乎在于,从本质上讲,解析器包含作为属性的函数,因此当我通过Object.assign()或什至访问解析器时,它们似乎被省略了JSON.stringify()

如果我console.log他们,我看到: {"Query":{},"Mutation":{}}

以下是解析器之一的外观:

 const productResolvers = {
   Query: {
     myProducts: (root, { userId }, context) => {
       return [
         { id: 1, amount: 100, expiry: '12625383984343', created: '12625383984343' },
         { id: 2, amount: 200, expiry: '12561351347311', created: '12625383984343' },
         { id: 3, amount: 200, expiry: '11346347378333', created: '12625383984343' },
         { id: 4, amount: 350, expiry: '23456234523453', created: '12625383984343' },
       ];
     },
   },
   Mutation: {
     addProduct: (root, { userId }, context) => {
       return { id: 350, amount: 100, expiry: '12625383984343', created: '12625383984343' };
     },
   }
 };
Run Code Online (Sandbox Code Playgroud)

假设还有另一个几乎完全相同的称为widgetResolvers

这是一个功能齐全的代码块:

 export const schema = makeExecutableSchema({
   typeDefs: [queries, mutations, productSchema, widgetSchema],
   resolvers
 });
Run Code Online (Sandbox Code Playgroud)

这是我要实现的目标:

 export const schema = makeExecutableSchema({
   typeDefs: [queries, mutations, productSchema, widgetSchema],
   resolvers: Object.assign({}, productResolvers, widgetResolvers)
 });
Run Code Online (Sandbox Code Playgroud)

我尚未加载使用剩余传播的功能(https://babeljs.io/docs/plugins/transform-object-rest-spread/)。我怀疑由于相同的原因Object.assign()它不会起作用。

哦,这就是为什么我怀疑这种合并无效的原因:为什么JSON.stringify无法显示作为函数的对象属性?

Dan*_*den 5

如果使用Object.assign(),则Query和Mutation属性不应以空结尾,但是会遇到问题,因为与lodash不同merge(),它不是递归的。Object.assign()仅比较其传递的对象的“直接”属性-在列表中移动时覆盖先前来源的属性。

由于QueryMutation是要传递的对象的属性,因此每个后续解析器都将覆盖前一个对象的QueryMutation,并且生成的对象仅保留传递到的最后一个对象的Query和Mutation属性Object.assign()

它整洁得多,但是如果您避免导入lodash,可以通过以下方式获得预期的行为:

const productResolver = {
  Query: { ... ? ... },
  Mutation: { ... ? ... }
}

const widgetResolver = {
  Query: { ... ? ... },
  Mutation: { ... ? ... }
}

const resolvers = {
  Query: Object.assign({}, widgetResolver.Query, productResolver.Query),
  Mutation: Object.assign({}, widgetResolver.Mutation, productResolver.Mutation)
}
Run Code Online (Sandbox Code Playgroud)

也有类型解析器?没问题:

const Widget = { ... ? ... }
const Product = { ... ? ... }

const resolvers = Object.assign(
  {
    Query: Object.assign({}, widgetResolver.Query, productResolver.Query),
    Mutation: Object.assign({}, widgetResolver.Mutation, productResolver.Mutation)
  },
  Widget,
  Product)
Run Code Online (Sandbox Code Playgroud)