根据此处的文档,graphql-tools 库中解析器函数的第二个参数是传递到查询中的对象
http://dev.apollodata.com/tools/graphql-tools/resolvers.html#Resolver-function-signature
但是,如果我使用 graphql >= 0.8.0 版本运行 graphql-tools,则作为第二个参数传递的“对象”会缺少一些对象属性。例如,arg.constructor
和 arg.hasOwnProperty
未定义。
在之前的版本 0.7.2 中,这两个语句的计算结果均为 true:
arg.consructor === Object
arg.hasOwnProperty === 'function'
有谁知道实际上作为第二个参数传递的是什么,或者为什么这些通常存在于 JS 对象上的属性是未定义的?
编辑如下:
我可以通过这样做来解决这个问题:
async resolverFuncForMutation(root, nonObjArgs, context) {
const args = Object.assign({}, nonObjArgs);
但我不想记住如何为每个解析器函数执行此操作。有谁知道如何配置是否可以在某种预解析 Hook 中进行配置?
最佳答案
Looking at the source code ,看起来在 0.8.0 之前,传递给解析器函数的对象被初始化为 {}
。现在它被初始化为Object.create(null)
。
您仍然收到一个对象,但是当使用 Object.create(null)
时,生成的对象不会从任何原型(prototype)继承,而 {}
继承来自 Object
原型(prototype)。像 hasOwnProperty
和 toString
这样的方法实际上属于原型(prototype),而不是对象本身。虽然您遇到的大多数对象(小“o”)都是对象(大“O”)的实例,但正如您在此处发现的那样,情况不一定是这样。
有一些很好的讨论here为什么 Object.create(null)
通常是首选。
据我所知,在按照您想要的方式将参数传递给解析器之前,无法修改参数。但是,如果您需要它们成为一个对象只是为了利用 hasOwnProperty
,那么稍微重构您的代码可能会更简单,即代替:
if (foo.hasOwnProperty('bar')) doSomething()
你可以这样做
if (foo.bar) doSomething()
关于javascript - graphql-tools 突变解析器的参数不是 v > 0.8.0 中的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45468180/