我使用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 exceeded
。 message
对象肯定不包含任何循环引用,message
既不大也不嵌套。当我使用虚拟数据或向下钻取到基本数据类型时,调用工作正常,即,以下工作正常
data: { 'test': [1, 2, 3]}
data: message['sender']['name']
< - 这是一个字符串值data: message['sender']['email']
< - 这是一个字符串值但是,data: message['sender']
已经失败,尽管它只包含一个带有两个简单字符串的对象。
解决方法data: JSON.stringify(message)
可行,但我仍然想了解问题所在。
编辑:我已将d1
和d2
添加到应该相同的对象中,console.log
输出看起来确实完全正确相同。但是,data: d2
正在运行,而data: d1
不是
EDIT2: JSON.parse(JSON.stringify(message))
作为另一种解决方法也可以完成这项工作。我猜我的message
对象不是我想象的那样。
答案 0 :(得分:1)
ajax-request
模块可能无法序列化对象。您确实意识到message
不是作为对象发送的,它必须转换为要发送的字符串格式。此外,我不确定是否可以序列化该数据,因为没有可以具有嵌套名称的表单输入。
您可以尝试使用更加经过测试的模块,例如request,或者只使用JSON。
答案 1 :(得分:0)
这可能是一个糟糕的解决方法,但至少它是有效的,所以我把它作为答案,希望它也可以帮助其他人:
data: JSON.parse(JSON.stringify(message))
我只是将message
对象转换为字符串并将其解析回Json对象。不知道为什么会有效。