Apollo Server v2 - 未调用 GraphQL 解析器
Posted
技术标签:
【中文标题】Apollo Server v2 - 未调用 GraphQL 解析器【英文标题】:Apollo Server v2 - GraphQL resolver not being invoked 【发布时间】:2020-01-28 06:05:56 【问题描述】:我是 graphql 世界的新手,我正在尝试使用 Apollo Server v2 设置多个模块化模式和解析器。
我注意到一个奇怪的行为,我的解析器的顺序存在问题。
在Object.assign(, propertiesResolver, agreementsResolver)
行中,propertiesResolver 定义的所有解析器都不会被调用,因为它是解析器顺序中的第一个。如果我交换了像 Object.assign(, agreementsResolver, propertiesResolver)
这样的两组解析器,现在由 agreementResolver 定义的解析器不会被调用。
我是否在这里遗漏了有关 graphql 执行的一些重要细节?
注意:我所有的架构定义和对应的解析器都被正确定义了,我觉得我导入东西的顺序有问题。
【问题讨论】:
【参考方案1】:使用Object.assign时:
目标对象中的属性将被源中的属性覆盖,如果它们具有相同的键。后面的来源的属性同样会覆盖早期的。
Object.assign
不会进行深度合并,这大概是您所期望的。如果两个源具有相同的属性,则仅使用最后一个源的属性。所以给定两个对象:
const a =
Query:
foo: () => 'FOO',
,
const b =
Query:
bar: () => 'BAR',
,
如果您使用Object.assign
合并它们,则生成的对象将具有一个匹配a
或b
的Query
属性(取决于后面的参数)。为了进行 deep 合并,将具有相同名称的属性对象组合在一起,您应该使用现有的解决方案,例如 lodash:
const resolvers = _.merge(a, b)
或something similar。
【讨论】:
啊!我怎么错过了!!厉害了,谢谢!!你觉得 JS 有没有类似 _.merge() 的东西? 不,规范中没有任何内容,据我所知,未来没有添加它的计划。您可以导入just the one function 或使用其他类似的库,如deepmerge
。或者自己写,因为你只需要下两层。以上是关于Apollo Server v2 - 未调用 GraphQL 解析器的主要内容,如果未能解决你的问题,请参考以下文章
在 GraphQL Apollo Server v2.0 中公开 HTTP GET API
zeit-now v2 + apollo-server-express:操场错误:无法访问服务器
如何避免在错误响应中将错误集合包装在 Apollo Server V2 中的错误对象中