graphql-tools 突变解析器的参数不是 v > 0.8.0 中的对象?
Posted
技术标签:
【中文标题】graphql-tools 突变解析器的参数不是 v > 0.8.0 中的对象?【英文标题】:Arguments to graphql-tools mutation resolver is not an object in v > 0.8.0? 【发布时间】:2018-01-10 02:42:06 【问题描述】:根据此处的文档,graphql-tools 库中解析器函数的第二个参数是传递给查询的对象
http://dev.apollodata.com/tools/graphql-tools/resolvers.html#Resolver-function-signature
但是,如果我使用 graphql >= 0.8.0 版本运行 graphql-tools,则作为第二个参数传递的“对象”缺少一些对象属性。例如,arg.constructor
和 arg.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
原型。像hasOwnProperty
和toString
这样的方法实际上属于原型,而不是对象本身。虽然您遇到的大多数对象(小“o”)都是 Object(大“O”)的实例,但不一定是您在此处发现的情况。
关于为什么 Object.create(null)
经常被首选,有一些很好的讨论 here。
据我所知,在参数以您想要的方式传递给解析器之前,无法修改它们。但是,如果您需要它们成为一个对象只是为了利用hasOwnProperty
,那么稍微重构您的代码可能会更简单,即:而不是:
if (foo.hasOwnProperty('bar')) doSomething()
你可以这样做
if (foo.bar) doSomething()
【讨论】:
谢谢老兄,就是这样!不幸的是,我有一些第三方库调用 hasOwnProperty 等。关于论点。最后为我的解析器函数编写了一个小预处理器来遍历参数数据结构并调用类似 args =Object.assign(, args)
的东西。像魅力一样工作以上是关于graphql-tools 突变解析器的参数不是 v > 0.8.0 中的对象?的主要内容,如果未能解决你的问题,请参考以下文章