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无法显示作为函数的对象属性?
如果使用Object.assign(),则Query和Mutation属性不应以空结尾,但是会遇到问题,因为与lodash不同merge(),它不是递归的。Object.assign()仅比较其传递的对象的“直接”属性-在列表中移动时覆盖先前来源的属性。
由于Query和Mutation是要传递的对象的属性,因此每个后续解析器都将覆盖前一个对象的Query和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)
}
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)