graphql-tools 突变解析器的参数不是 v > 0.8.0 中的对象?

Posted

技术标签:

【中文标题】graphql-tools 突变解析器的参数不是 v > 0.8.0 中的对象?【英文标题】:Arguments to graphql-tools mutation resolver is not an object in v > 0.8.0? 【发布时间】:2018-01-10 02:42:06 【问题描述】:

根据此处的文档,graphql-tools 库中解析器函数的第二个参数是传递给查询的对象

http://dev.apollodata.com/tools/graphql-tools/resolvers.html#Resolver-function-signature

但是,如果我使用 graphql >= 0.8.0 版本运行 graphql-tools,则作为第二个参数传递的“对象”缺少一些对象属性。例如,arg.constructorarg.hasOwnProperty 未定义。

在之前的版本 0.7.2 中,这两个语句的计算结果都为 true:

arg.consructor === Object
arg.hasOwnProperty === 'function'

有谁知道实际上作为第二个参数传递了什么,或者为什么这些通常存在于 JS 对象上的属性是未定义的?

在下面编辑:

我可以通过这样做来解决这个问题:

async resolverFuncForMutation(root, nonObjArgs, context) 
  const args = Object.assign(, nonObjArgs);

但我不想记住如何为每个解析器函数执行此操作。有没有人知道如果有办法在某种预解析挂钩中配置它?

【问题讨论】:

【参考方案1】:

Looking at the source code,看起来在 0.8.0 之前,传递给解析器函数的对象被初始化为 。现在它被初始化为Object.create(null)

您仍在接收一个对象,但是当使用Object.create(null) 时,生成的对象不会继承自任何原型,而 继承自Object 原型。像hasOwnPropertytoString 这样的方法实际上属于原型,而不是对象本身。虽然您遇到的大多数对象(小“o”)都是 Object(大“O”)的实例,但不一定是您在此处发现的情况。

关于为什么 Object.create(null) 经常被首选,有一些很好的讨论 here。

据我所知,在参数以您想要的方式传递给解析器之前,无法修改它们。但是,如果您需要它们成为一个对象只是为了利用hasOwnProperty,那么稍微重构您的代码可能会更简单,即:而不是:

if (foo.hasOwnProperty('bar')) doSomething()

你可以这样做

if (foo.bar) doSomething()

【讨论】:

谢谢老兄,就是这样!不幸的是,我有一些第三方库调用 hasOwnProperty 等。关于论点。最后为我的解析器函数编写了一个小预处理器来遍历参数数据结构并调用类似 args = Object.assign(, args) 的东西。像魅力一样工作

以上是关于graphql-tools 突变解析器的参数不是 v > 0.8.0 中的对象?的主要内容,如果未能解决你的问题,请参考以下文章

“graphql-tools”中的嵌套解析器不起作用

如何使用 graphql-tools 使用或解析枚举类型?

突变中的嵌套对象

GraphQL 订阅字段无法访问解析器的上下文

使用 buildSchema 时如何访问字段解析器中父解析器的值?

graphql 错误:突变与 where 不工作