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

时间:2017-08-02 18:14:16

标签: javascript graphql graphql-js apollo apollo-server

根据这里的文档,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 个答案:

答案 0 :(得分: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()