我正在测试post方法来创建一个todo项目,如下所示。我在chrome中使用postman来模拟post方法调用。但是,它不起作用,并给我以下错误。我怀疑body-parser库的工作方式有问题。我在这里做错了什么?
1 SyntaxError: Unexpected token b
2: at parse (/Users/zack/mydrive/proj/express-demo/node_modules/body-parser/lib/types/json.js:83:15)
3: at /Users/zack/mydrive/proj/express-demo/node_modules/body-parser/lib/read.js:116:18
4: at invokeCallback (/Users/zack/mydrive/proj/express-demo/node_modules/body-parser/node_modules/raw-body/index.js:262:16)
5: at done (/Users/zack/mydrive/proj/express-demo/node_modules/body-parser/node_modules/raw-body/index.js:251:7)
6: at IncomingMessage.onEnd (/Users/zack/mydrive/proj/express-demo/node_modules/body-parser/node_modules/raw-body/index.js:308:7)
7 at IncomingMessage.emit (events.js:104:17)
8 at _stream_readable.js:908:16
代码:
var express = require('express');
var app = express();
var handlebars = require('express-handlebars');
var bodyParser = require('body-parser');
//MIDDLEWARE
app.engine('handlebars', handlebars({defaultLayout: 'main'}));
app.set('view engine', 'handlebars');
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({
extended: true
}));
// TODOS
var todos = [
{ body: "take out the trash",completed: false},
{ body: "Do the laundry",completed:true},
{ body: "Make a screencast",completed:false}
]
app.post('/todos', function (req, res){
console.log("todo:", req.body);
var todo = req.body;
console.log("todo:"+todo);
todos.push(todo);
res.status(200).json(todo);
res.send('OK')
})
此外,我发现问题是因为这条线。
app.use(bodyParser.json());
答案 0 :(得分:0)
您确定要以JSON格式发送请求吗?确保你已在Postman中选择它 - https://imgur.com/j0M7TEX。
如果这不起作用,您可以尝试以下方法 -
...
app.post('/todos', function (req, res){
console.log("todo:", req.body);
var todo = req.body;
console.log("todo:"+todo);
todos.push(todo);
// Only try to send a single response.
res.json(todo);
});
看起来你正在尝试发送两个响应,一个包含JSON,另一个包含text / plain('Ok')。
答案 1 :(得分:0)
好像你的程序试图将帖子数据解释为json数据 - 并且当它试图解析可能是url编码的请求数据时会产生错误。
也许考虑以json格式发送数据。您必须设置请求标头以指示数据类型为json。请参阅此答案以获取示例:
答案 2 :(得分:0)
我刚刚在邮递员中创建了一个新会话,它开始工作了。我不确定是否有缓存效果但它现在有效。我根本没有做任何代码更改。现在将其作为解决方案发布。
答案 3 :(得分:0)
不要在你的JSON值上加上引号。
不是" okay2" ,只是 okay2 。
我认为邮递员如果需要自己添加引号,在这种情况下创建"" okay2""这不是有效的JSON。
顺便说一下,你可以点击"行"进行测试。单选按钮并编写自己的JSON。