2017-08-02 32 views
0

据这里的文件,第二个参数在graphql工具库中的解析函数传递到查询graphql-tools突变解析器的参数不是v> 0.8.0中的对象吗?

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

但是一个对象,如果我跑graphql工具使用版本graphql的> = 0.8.0,作为第二个参数传递的“对象”缺少一些对象属性。例如,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”)的实例,但这并不一定如你在这里发现的那样。

有一些很好的讨论here围绕为什么Object.create(null)往往是首选。

据我所知,在按照自己喜欢的方式传递给解析器之前,无法修改参数。但是,如果你需要他们的对象只是利用hasOwnProperty,它可能是简单的,只是重构你的代码一点点,即代替:

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

你可以做

if (foo.bar) doSomething() 
+0

谢谢男人,就是这样! 不幸的是我有一些第三方库调用hasOwnProperty,等等。论证。 结束为我的解析器函数编写一个小预处理器来遍历参数数据结构并调用类似args ='Object.assign({},args)'的东西。像魅力一样工作 – albertlockett

相关问题