TypeError: obj.hasOwnProperty is not a function when calling Graphql mutation
TypeError: obj.hasOwnProperty is not a function when calling Graphql mutation
我收到一个奇怪的错误,无法弄清楚我做错了什么。我写了一个 graphql 突变来调用 api:
domainStuff: async (parent, { command, params }, { models }) => {
console.log("Params:", params);
const result = await dd24Api(command, params);
return result;
}
这是我调用的函数:
export default async (command, parameter) => {
const args = _.merge({ params: parameter }, auth);
// Eleminate copying mistakes
console.log(typeof args);
const properCommand = command + "Async";
const result = await soap
.createClientAsync(apiWSDL)
.then(client => {
return client[properCommand](args)
.then(res => {
console.log(res[command + "Result"]);
return res[command + "Result"];
})
.catch(err => {
console.log(err);
return err;
});
})
.catch(err => console.log(err));
return result;
使用此查询变量:
{
"command": "CheckDomain",
"params": {"domain": "test.it"}
}
console.log 告诉我 args 是一个对象,但我得到这个错误(来自第一个 catch 块):
TypeError: obj.hasOwnProperty is not a function
怎么可能?毕竟我检查过它是否是一个对象,它是。更奇怪的是,如果我在查询中给出一个硬编码对象,例如:
domainStuff: async (parent, { command, params }, { models }) => {
console.log("Params:", params);
const result = await dd24Api(command, {domain: "test.com"});
return result;
}
然后它工作得很好。我究竟做错了什么?感谢您提前提供帮助。
编辑:我正在使用 "graphql-server-express": "^0.8.0" 和 "graphql-tools": "^1.0.0"
如果您使用的是 graphql-js
,那么在很多地方都可以使用 Object.create(null)
创建新对象,这与 {}
不同,您可以在此处阅读相关说明 Creating Js object with Object.create(null)?
但本质上,使用 Object.create(null)
创建的对象没有 hasOwnProperty
方法
您可以在节点中尝试使用
const obj1 = Object.create(null)
console.log(typeof obj1.hasOwnProperty)
// 'undefined'
const obj2 = {}
console.log(typeof obj2.hasOwnProperty)
// 'function'
可用于确定对象是否具有可作用于使用 Object.create(null)
创建的对象的键的另一种方法是
function hasKey(obj, key) {
return Object.keys(obj).indexOf(key) !== -1
}
好的,经过长时间的反复试验,我终于解决了这个问题。解决方案是更改我传递给 .merge 函数的对象的位置。工作代码是:
const args = _.merge(auth, { params: parameter });
两者都是对象,但似乎来自 graphql 变量的对象没有所需的 hasOwnProperty 方法。简单来说,我不是将 "good object" (auth) 复制到坏的(参数)中,而是将坏的复制到具有所需功能的好的中。
希望这对同样遇到此错误的其他人有所帮助。
您可以通过以下方式将其转换为标准对象:
data = JSON.parse(JSON.stringify(data));
我收到一个奇怪的错误,无法弄清楚我做错了什么。我写了一个 graphql 突变来调用 api:
domainStuff: async (parent, { command, params }, { models }) => {
console.log("Params:", params);
const result = await dd24Api(command, params);
return result;
}
这是我调用的函数:
export default async (command, parameter) => {
const args = _.merge({ params: parameter }, auth);
// Eleminate copying mistakes
console.log(typeof args);
const properCommand = command + "Async";
const result = await soap
.createClientAsync(apiWSDL)
.then(client => {
return client[properCommand](args)
.then(res => {
console.log(res[command + "Result"]);
return res[command + "Result"];
})
.catch(err => {
console.log(err);
return err;
});
})
.catch(err => console.log(err));
return result;
使用此查询变量:
{
"command": "CheckDomain",
"params": {"domain": "test.it"}
}
console.log 告诉我 args 是一个对象,但我得到这个错误(来自第一个 catch 块):
TypeError: obj.hasOwnProperty is not a function
怎么可能?毕竟我检查过它是否是一个对象,它是。更奇怪的是,如果我在查询中给出一个硬编码对象,例如:
domainStuff: async (parent, { command, params }, { models }) => {
console.log("Params:", params);
const result = await dd24Api(command, {domain: "test.com"});
return result;
}
然后它工作得很好。我究竟做错了什么?感谢您提前提供帮助。
编辑:我正在使用 "graphql-server-express": "^0.8.0" 和 "graphql-tools": "^1.0.0"
如果您使用的是 graphql-js
,那么在很多地方都可以使用 Object.create(null)
创建新对象,这与 {}
不同,您可以在此处阅读相关说明 Creating Js object with Object.create(null)?
但本质上,使用 Object.create(null)
创建的对象没有 hasOwnProperty
方法
您可以在节点中尝试使用
const obj1 = Object.create(null)
console.log(typeof obj1.hasOwnProperty)
// 'undefined'
const obj2 = {}
console.log(typeof obj2.hasOwnProperty)
// 'function'
可用于确定对象是否具有可作用于使用 Object.create(null)
创建的对象的键的另一种方法是
function hasKey(obj, key) {
return Object.keys(obj).indexOf(key) !== -1
}
好的,经过长时间的反复试验,我终于解决了这个问题。解决方案是更改我传递给 .merge 函数的对象的位置。工作代码是:
const args = _.merge(auth, { params: parameter });
两者都是对象,但似乎来自 graphql 变量的对象没有所需的 hasOwnProperty 方法。简单来说,我不是将 "good object" (auth) 复制到坏的(参数)中,而是将坏的复制到具有所需功能的好的中。
希望这对同样遇到此错误的其他人有所帮助。
您可以通过以下方式将其转换为标准对象:
data = JSON.parse(JSON.stringify(data));