4

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

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

让我们假设还有一个几乎相同的名为widgetResolvers.

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

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

这是我想要实现的目标:

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

我还没有加载使用休息传播的能力(https://babeljs.io/docs/plugins/transform-object-rest-spread/)。我怀疑它不会因为同样的原因Object.assign()不起作用。

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

4

1 回答 1

8

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

因为QueryandMutation是被传递对象的属性,所以每个后续的解析器都会覆盖前一个对象的Queryand Mutation,结果对象只保存传递给 的最后一个对象的 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)
}

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

const Widget = { ... ✂ ... }
const Product = { ... ✂ ... }

const resolvers = Object.assign(
  {
    Query: Object.assign({}, widgetResolver.Query, productResolver.Query),
    Mutation: Object.assign({}, widgetResolver.Mutation, productResolver.Mutation)
  },
  Widget,
  Product)
于 2017-07-29T03:16:39.837 回答