繁体   English   中英

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

[英]Arguments to graphql-tools mutation resolver is not an object in v > 0.8.0?

根据此处的文档,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);

但我不想记住如何为每个解析程序功能执行此操作。 有谁知道如何以某种方式将其配置为在某种预解析挂钩中发生?

查看源代码 ,看起来像是在0.8.0之前,传递给resolver函数的对象已初始化为{} 现在,将其初始化为Object.create(null)

您仍在接收对象,但是使用Object.create(null) ,所得对象不会从任何原型继承,而{}则从Object原型继承。 hasOwnPropertytoString类的方法实际上属于原型,而不是对象本身。 尽管您遇到的大多数对象(小“ o”)将是对象(大“ O”)的实例,但这不一定是您在此处发现的情况。

围绕为何为什么通常首选Object.create(null)进行一些很好的讨论。

据我所知,在将参数传递给解析器之前,无法以您希望的方式对其进行修改。 但是,如果仅使用hasOwnProperty就需要它们成为一个Object,那么只需重构一下代码可能会更简单,例如,代替:

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

你可以做

if (foo.bar) doSomething()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM