JSONparsingJSONstring抛出“无法将对象转换为原始值”

server.js

使用body parser中间件,把手和expression

路线

module.exports = function (app) { app.post('/questionnaire/submit', function (req, res) { // Ajax Call var data = JSON.parse(req.body); res.send({}); }); }; 

客户

 function submitData() { // Send a data object to the server $.ajax({ type: 'POST', url: '/questionnaire/submit', dataType: "json", data: JSON.stringify({ satisfactory: "text 1", improvement: "text 2", rating: 0.7 }) }).done(function () { $(location).attr('href', '/sendOff'); }).fail(function () { }); } 

当loggingreq.body我得到一个JSONstring

{'{“满意”:“文字1”,“改进”:“文字2”,“评价”:0.7}':''}

我试图parsing这个string到一个对象。 当我这样做,我得到这个错误消息

  TypeError: Cannot convert object to primitive value at JSON.parse (<anonymous>) at C:\Users\mah\Desktop\FeedbackTool\Server\Routes\questionnaire.js:12:25 at Layer.handle [as handle_request] (C:\Users\mah\node_modules\express\lib\router\layer.js:95:5) at next (C:\Users\mah\node_modules\express\lib\router\route.js:137:13) at Route.dispatch (C:\Users\mah\node_modules\express\lib\router\route.js:112:3) at Layer.handle [as handle_request] (C:\Users\mah\node_modules\express\lib\router\layer.js:95:5) at C:\Users\mah\node_modules\express\lib\router\index.js:281:22 at Function.process_params (C:\Users\mah\node_modules\express\lib\router\index.js:335:12) at next (C:\Users\mah\node_modules\express\lib\router\index.js:275:10) at C:\Users\mah\node_modules\body-parser\lib\read.js:130:5 

所以我怎样才能parsingstring到一个对象?

通常我会执行JSON.parse(req.body)

您需要设置正确的contentType:

 $.ajax({ type: 'POST', url: '/questionnaire/submit', contentType: 'application/json', data: JSON.stringify({ satisfactory: "text 1", rating: 0.7 }) }); app.post('/questionnaire/submit', function (req, res) { // Ajax Call var data = JSON.parse(req.body); console.log(data.rating); // 0.7 res.send(data); }); 

此外,使用body-parser可以避免在服务器端的链接 JSON.parse调用。

既然你正在使用body-parser中间件,那么你就req.body再parsingreq.body ,因为它已经被body-parser

如果你使用了app.use(bodyParser.json())

那么你只需要这样做

 module.exports = function (app) { app.post('/questionnaire/submit', function (req, res) { // Ajax Call var data = req.body; // this is already parsed and is an object res.send({}); }); }; 

正如@TJ Crowder所指出的那样,你也应该发送正确的contentType以便body-parser知道它的json

 function submitData() { // Send a data object to the server $.ajax({ type: 'POST', url: '/questionnaire/submit', contentType: 'application/json', data: JSON.stringify({ satisfactory: "text 1", improvement: "text 2", rating: 0.7 }) }).done(function () { $(location).attr('href', '/sendOff'); }).fail(function () { }); } 

dataType不会说你要发送什么types的数据,而是说你期望的是什么types的响应。 你需要说你正在发送JSON,通过contentType: "application/json"在你的ajax调用。 文档中的详细信息。 (到目前为止,你并不是第一个也是唯一一个被dataType命名的人。

这是问题的一半。 见斯塔莫斯的另一半的答案 。