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);

但我不想记住如何为每个解析器功能做到这一点。如果有一种方法可以将其配置为在某种预解析挂钩中发生,有谁知道怎么做?

4

1 回答 1

1

查看源代码,看起来在 0.8.0 之前,传递给解析器函数的对象被初始化为{}. 现在它被初始化为Object.create(null).

您仍然收到一个对象,但是在Object.create(null)使用时,生成的对象不会从任何原型{}继承,而是从原型继承Object。方法类似于hasOwnProperty并且toString实际上属于原型,而不是对象本身。虽然您遇到的大多数对象(小“o”)都是 Object(大“O”)的实例,但不一定是您在此处发现的情况。

这里有一些关于为什么Object.create(null)经常被首选的很好的讨论。

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

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

你可以做

if (foo.bar) doSomething()
于 2017-08-02T22:02:16.140 回答