JavaScript&;Node.js-控制器函数中的JSON字符串不正确

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

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 = 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我做了一些调查,问题是