gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:44:26 28 4
gpt4 key购买 nike

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com