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 合并它们,则生成的对象将具有一个匹配abQuery 属性(取决于后面的参数)。为了进行 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 中的错误对象中

在 Apollo-Server v2 中间件之后如何使用 Express 中间件?

Apollo-Server-Express 未收到上传对象

Apollo-server-express Session 未定义问题