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

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

但我不想记住如何为每个解析器函数执行此操作。有谁知道如何配置是否可以在某种预解析 Hook 中进行配置?

最佳答案

Looking at the source code ,看起来在 0.8.0 之前,传递给解析器函数的对象被初始化为 {}。现在它被初始化为Object.create(null)

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

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

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

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

你可以这样做

if (foo.bar) doSomething()

关于javascript - graphql-tools 突变解析器的参数不是 v > 0.8.0 中的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45468180/

相关文章:

javascript - 通过 javascript 从 xml 文件更新对象(IE 问题)

javascript - Protractor 和 for 循环

javascript - 如何判断一个字符串是否是一个字符串化的 JSON 对象

javascript - 如何为 GraphQL 服务器设计以下解析器?

interface - GraphQL 接口(interface) : [interface] expects "fieldname" but [type] does not provide it

javascript - 根据数据点强制面积图的 X 轴刻度线

Python Graphene 处理多对多关系

express - 突变上的未定义参数,使用 apollo-server

node.js - GraphQL - 向 ObjectType 传递参数

javascript - Node 14 导致 graphqljs 出现未知问题