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