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-tools 的 graphql 版本 >= 0.8.0,作为第二个参数传递的 "object" 缺少一些对象属性。例如,arg.constructorarg.hasOwnProperty 未定义。

在以前的版本 0.7.2 中,这两个语句的计算结果都为真:

arg.consructor === Object
arg.hasOwnProperty === 'function'

有谁知道实际上作为第二个参数传递的是什么,或者为什么这些通常存在于 JS 对象上的属性是未定义的?

编辑如下:

我可以通过这样做来解决这个问题:

async resolverFuncForMutation(root, nonObjArgs, context) {
  const args = Object.assign({}, nonObjArgs);

但我不想记住如何为每个解析器函数执行此操作。有谁知道如果有一种方法可以将其配置为在某种预解析挂钩中发生?

Looking at the source code,貌似在0.8.0之前,传递给resolver函数的对象被初始化为{}。现在它被初始化为 Object.create(null).

您仍然接收一个对象,但是当使用 Object.create(null) 时,生成的对象不继承任何原型,而 {} 继承自 Object 原型。 hasOwnPropertytoString 这样的方法实际上属于原型,而不是对象本身。虽然您遇到的大多数对象(小 "o")都是 Object(大 "O")的实例,但正如您在此处发现的那样,情况不一定如此。

关于为什么 Object.create(null) 通常是首选,有一些很好的讨论

据我所知,在以您喜欢的方式将参数传递给解析器之前,无法修改参数。然而,如果你需要它们成为一个对象只是为了利用 hasOwnProperty,那么重构你的代码可能会更简单,即而不是:

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

你可以做到

if (foo.bar) doSomething()