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
命名的人。
这是问题的一半。 见斯塔莫斯的另一半的答案 。