"超出最大呼叫堆栈大小"使用Node.js

时间:2017-09-09 01:31:23

标签: javascript json node.js ajax

我使用ajax-request包通过我的Node.js应用程序中的post请求发送Json数据。相关的代码段如下所示:

logMessage : function(url, message, next) {
  var d1 = message["sender"];
  var d2 = { id: message[sender"]["id"], name: message["sender"]["name"], email: message["sender"]["email"] };
  console.log(d1); // Both outputs look 
  console.log(d2); // exactly the same
  request.post({ url: url, headers: {}, data: d1 }, function (error, response, body) {
    //Check for error
    if(error){
      next(null, {}); // I'm not worried if the logging fails
    }
    //Check for right status code
    if(response.statusCode !== 200){
      next(null, {}); // I'm not worried if the logging fails
    }
    next(null, {})    // All good
  });
}

问题是我得到RangeError: Maximum call stack size exceededmessage对象肯定不包含任何循环引用,message既不大也不嵌套。当我使用虚拟数据或向下钻取到基本数据类型时,调用工作正常,即,以下工作正常

  • data: { 'test': [1, 2, 3]}
  • data: message['sender']['name']< - 这是一个字符串值
  • data: message['sender']['email']< - 这是一个字符串值

但是,data: message['sender']已经失败,尽管它只包含一个带有两个简单字符串的对象。

解决方法data: JSON.stringify(message)可行,但我仍然想了解问题所在。

编辑:我已将d1d2添加到应该相同的对象中,console.log输出看起来确实完全正确相同。但是,data: d2正在运行,而data: d1不是

EDIT2: JSON.parse(JSON.stringify(message))作为另一种解决方法也可以完成这项工作。我猜我的message对象不是我想象的那样。

2 个答案:

答案 0 :(得分:1)

ajax-request模块可能无法序列化对象。您确实意识到message不是作为对象发送的,它必须转换为要发送的字符串格式。此外,我不确定是否可以序列化该数据,因为没有可以具有嵌套名称的表单输入。

您可以尝试使用更加经过测试的模块,例如request,或者只使用JSON。

答案 1 :(得分:0)

这可能是一个糟糕的解决方法,但至少它是有效的,所以我把它作为答案,希望它也可以帮助其他人:

data: JSON.parse(JSON.stringify(message))

我只是将message对象转换为字符串并将其解析回Json对象。不知道为什么会有效。