JSON字符串上的JSON解析抛出"无法将对象转换为原始值"

时间:2017-12-05 14:12:31

标签: javascript json node.js

server.js

使用正文解析器中间件,把手和表达

路线

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 () {

    });
}

当记录req.body时,我得到一个JSON字符串

  

{' {"令人满意":"文字1","改进":"文字2",&#34评分":0.7}':'' }

我尝试将此字符串解析为对象。当我这样做时,我收到此错误消息

     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

那么如何将字符串解析为对象?

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

3 个答案:

答案 0 :(得分:4)

由于您使用的是body-parser中间件,因此您无需再次解析req.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({});
    });
};
正如@ T.J所指出的那样。克劳德你也应该发送正确的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 () {

    });
}

答案 1 :(得分:3)

dataType没有说明您发送的数据类型,它会说明您期望的响应类型。您需要在contentType: "application/json"来电中通过ajax说明您正在发送JSON。 the documentation中的详细信息。 (到目前为止,你不是第一个或唯一一个被dataType命名的人。)

这是问题的一半。另一半见Stamos' answer

答案 2 :(得分:3)

您需要设置正确的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,您可以避免在服务器端the link进行JSON.parse次呼叫。