4

我收到一个奇怪的错误,无法弄清楚我做错了什么。我写了一个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”

4

3 回答 3

7

如果您使用graphql-js的是很多地方创建新对象的地方,Object.create(null)这与{}您可以在此处使用 Object.create(null) 创建 Js 对象?

但本质上,用创建的对象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
}
于 2017-12-12T16:52:12.817 回答
4

您可以通过以下方式将其转换为标准对象:

data = JSON.parse(JSON.stringify(data));
于 2019-06-07T05:12:54.620 回答
0

好的,经过长时间的反复试验,我能够解决问题。更改我传递给 .merge 函数的对象的位置是解决方案。工作代码是:

  const args = _.merge(auth, { params: parameter });

两者都是对象,但似乎来自 graphql 变量的对象没有所需的 hasOwnProperty 方法。简单地说,我不是将“好对象”(auth)复制到坏对象(参数)中,而是将坏对象复制到具有所需功能的好对象中。

希望这可以帮助同样遇到此错误的其他人。

于 2017-12-14T09:48:11.180 回答