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)
。
答案 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
次呼叫。