根据这里的文档,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);
但我不想记住如何为每个解析器功能做到这一点。有没有人知道如果有一种方法可以配置在某种预分辨率钩子中发生?
答案 0 :(得分:1)
Looking at the source code,看起来像0.8.0之前,传递给解析器函数的对象被初始化为{}
。现在它被初始化为Object.create(null)
。
您仍在接收对象,但是当使用Object.create(null)
时,生成的对象不会从任何原型继承,而{}
继承自Object
原型。像hasOwnProperty
和toString
这样的方法实际上属于原型,而不是对象本身。虽然您遇到的大多数对象(小“o”)都是Object(大“O”)的实例,但这并不一定就像您在此处发现的那样。
关于为什么Object.create(null)
通常更受欢迎,我们有一些很好的讨论here。
据我所知,在你按照自己喜欢的方式将参数传递给解析器之前,没有办法修改它们。但是,如果您需要将它们作为对象来使用hasOwnProperty
,那么稍微重构代码可能更简单,即代替:
if (foo.hasOwnProperty('bar')) doSomething()
你可以做到
if (foo.bar) doSomething()