TypeError:obj.hasOwnProperty在调用Graphql变异时不是函数

时间:2017-12-12 13:11:36

标签: node.js graphql graphql-js node-soap

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

3 个答案:

答案 0 :(得分:3)

如果您使用的是graphql-js,则有很多地方使用Object.create(null)创建新对象,这与[{1}}不同,您可以在此处阅读有关此内容的说明{{3} }

但基本上使用{}创建的对象没有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)

答案 1 :(得分:1)

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

class musicPlayer {
    public static var instance = musicPlayer()
    var player = AVPlayer()

    func initPlayer(url : String) {
        guard let url = URL.init(string: url) else { return }
        let playerItem = AVPlayerItem.init(url: url)
        player = AVPlayer.init(playerItem: playerItem)
        playAudioBackground()
    }

    func playAudioBackground() {
        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, mode: AVAudioSessionModeDefault, options: [.mixWithOthers, .allowAirPlay])
            print("Playback OK")
            try AVAudioSession.sharedInstance().setActive(true)
            print("Session is Active")
        } catch {
            print(error)
        }
    }

    func pause(){
        player.pause()
    }

    func play() {
        player.play()
    }
}

答案 2 :(得分:0)

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

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

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

希望这有助于其他遇到此错误的人。

相关问题