JavaScript&;Node.js-控制器函数中的JSON字符串不正确
JavaScript&Node.js-控制器函数中的json字符串不正确 我通过ajax将JSON发送到Node.js中的路由。但是当我在node.js函数中获取req.body时。。。JSON看起来不正确。我错过了什么 JavaScript:JavaScript&;Node.js-控制器函数中的JSON字符串不正确,javascript,arrays,node.js,json,Javascript,Arrays,Node.js,Json,JavaScript&Node.js-控制器函数中的json字符串不正确 我通过ajax将JSON发送到Node.js中的路由。但是当我在node.js函数中获取req.body时。。。JSON看起来不正确。我错过了什么 JavaScript: var getID = $('.input-id').val(); var getName = $('.input-name').val(); var books = $('.select-books').val(); var books = boo
var getID = $('.input-id').val();
var getName = $('.input-name').val();
var books = $('.select-books').val();
var books = books.map(function(book) {
return {id: book};
});
var dataaddID = {};
dataaddID['add'] = { id : getID, name : getName, books };
var jsonaddID = JSON.stringify(dataaddID);
console.log(jsonaddID);
$.ajax({
url:'/books/add',
type:'POST',
headers: {'X-CSRF-Token': csrfKey},
dataType: 'json',
data: jsonaddID,
success:function(data){
console.log(data);
}
});
控制台结果:
{"add":{"id":"T1088","name":"Zynula","books":[{"id":"1"},{"id":"2"}]}}
Node.js路由/函数
postBooks: async (req, res, next) => {
console.log(req.body);
var getBody = JSON.stringify(req.body);
console.log(getBody);
}
Weired结果:
{ '{"add":{"id":"T1088","name":"Zynula","books":': { '{"id":"1"},{"id":"2"}': '' } }
{"{\"add\":{\"id\":\"T1088\",\"name\":\"Zynula\",\"books\":":{"{\"id\":\"1\"},{\"id\":\"2\"}":""}}
预期结果:
{"add":{"id":"T1088","name":"Zynula","books":[{"id":"1"},{"id":"2"}]}}
...
而不是尝试
var sendBody = JSON.stringify(req.body);
试一试
你将得到答案,而不是去尝试
var sendBody = JSON.stringify(req.body);
试一试
您将得到答案在发送数据之前,尝试不使用
JSON.stringify()
。我相信Ajax会为您序列化它。在发送数据之前,尝试不使用JSON.stringify()
。我相信Ajax会为您序列化它。我在express中对解析进行了一些研究。在未检查所有详细信息的情况下,原因是,如果您将数据作为字符串传递:
{"add":{"id":"T1088","name":"Zynula","books":[{"id":"1"},{"id":"2"}]}}
然后,内容应解释为JSON的头丢失,解析器解释参数是否以key[subKey]=value
的形式传入名称-值对,因此解析器将其拆分为以下形式:
{"add":{"id":"T1088","name":"Zynula","books":
[
{"id":"1"},{"id":"2"}
]
}}
因此,{“add”:{“id”:“T1088”,“name”:“Zynula”,“books”:
id第一个键和{“id”:“1”},{“id”:“2”}
子键和最后一个}
被忽略,因此值为'
因此,要么将其作为对象传递,而不使用stringify(like),那么jQuery将为您序列化数据,并添加正确的头,告诉服务器它是application/x-www-form-urlencoded
(如果格式化为,则使用jQuery格式)
如果向其发送数据的API需要JSON,则需要添加自己的正确标头:
data: JSON.stringify(yourData),
contentType: 'application/json; charset=utf-8',
我研究了一下express中的解析。在未检查所有详细信息的情况下,原因是,如果您将数据作为字符串传递:
{"add":{"id":"T1088","name":"Zynula","books":[{"id":"1"},{"id":"2"}]}}
然后,内容应解释为JSON的头丢失,解析器解释参数是否以key[subKey]=value
的形式传入名称-值对,因此解析器将其拆分为以下形式:
{"add":{"id":"T1088","name":"Zynula","books":
[
{"id":"1"},{"id":"2"}
]
}}
因此,{“add”:{“id”:“T1088”,“name”:“Zynula”,“books”:
id第一个键和{“id”:“1”},{“id”:“2”}
子键和最后一个}
被忽略,因此值为'
因此,要么将其作为对象传递,而不使用stringify(like),那么jQuery将为您序列化数据,并添加正确的头,告诉服务器它是application/x-www-form-urlencoded
(如果格式化为,则使用jQuery格式)
如果向其发送数据的API需要JSON,则需要添加自己的正确标头:
data: JSON.stringify(yourData),
contentType: 'application/json; charset=utf-8',
您是否手工剪切粘贴或格式化第二个weired结果?看起来您缺少字符串末尾的引号。最后一个字符串也不会转义。最后一个books对象不正确,它不应该是一个数组吗?这个问题涉及多个部分,不包含。您没有显示如何发送数据。。您没有显示您发送的确切数据。不知道服务器端设置是什么。从您发布的内容来看,
req.body
已经是JSON字符串了。不是一个物体。再次将其转换为JSON不会有任何好处。快速安装程序可能未命中正文解析器,或者您以错误的方式发送数据,或者其他任何内容。如果console.log(req.body)
确实报告了{{“add”:{“id”:“T1088”,“name”:“Zynula”,“books”:“{“id”:“1”},{“id”:“2”}:'}}
那么它就不属于控制台.log(jsonaddID);
报告{“add”:{“id”:“T1088”,“name”:“Zynula”,“books”:“id”:“1”{“id”:“2”}
或者您必须在这两者之间进行一些额外的转换。在开发人员控制台的“网络”选项卡中为该POST请求报告的表单数据是什么样子的?您是否手动剪切并粘贴或格式化了第二个weired结果?看起来您在最后的字符串中缺少了一个引号。还有最后一个string没有转义。最后一个books对象不正确,不应该是数组吗?这个问题涉及多个部分,并且不包含。您没有显示如何发送数据。您没有显示确切发送的数据。不知道服务器端设置是什么。从您发布的内容来看,它看起来像req.body
已经是JSON字符串。不是对象。再次将其转换为JSON不会有任何好处。Express安装程序可能会错过主体解析器
,或者您以错误的方式发送数据,或者其他任何事情。如果console.log(req.body);
确实报告了{{add:{id:“T1088”,“name:“Zynula”,“books:”:{{{id:“2”:''}
那么它就不属于控制台.log(jsonaddID);
报告{“add”:{“id”:“T1088”,“name”:“Zynula”,“books”:[{“id”:“1”},{“id”:“2”}}}
或者您必须在这两者之间进行一些额外的转换。在开发人员控制台的“网络”选项卡中为该POST请求报告的表单数据是什么样子的?然后我会得到“SyntaxError:位置1处JSON中的意外标记o”…因此在构建字符串的某个地方有一个错误,然后我会得到“Synt”axError:JSON中的意外标记o位于位置1'…因此,在构建字符串的某个地方,随时都会出现错误@PhilippM@t.niese这是绝对正确的。我不得不假设jQuery没有使用全局JSON对象来序列化有效负载,因为即使您双重序列化一个对象,双重解析也会将您引导到同一个对象结构。@DevYego我做了一些调查,问题是服务器端。我本以为服务器不会以这种方式进行部分解析。任何时候@PhilippM@t.niese这是绝对正确的,我不得不假设jQuery没有使用全局JSON对象来序列化负载,因为即使对对象进行双重序列化,也会使用双重parsing将引导您找到相同的对象结构。@DevYego我做了一些调查,问题是