我正在使用ajax-request包通过Node.js应用程序中的发布请求发送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对象不是我想的那样。

最佳答案

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

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

关于javascript - 使用Node.js发送Json时“超出了最大调用堆栈大小”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46126366/

10-11 22:25
查看更多