使用express JS进行发布时出错

时间:2015-12-24 22:59:48

标签: javascript json node.js express crud

我正在测试post方法来创建一个todo项目,如下所示。我在chrome中使用postman来模拟post方法调用。但是,它不起作用,并给我以下错误。我怀疑body-parser库的工作方式有问题。我在这里做错了什么?

enter image description here

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

4 个答案:

答案 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')。

http://expressjs.com/fr/api.html#res.json

答案 1 :(得分:0)

好像你的程序试图将帖子数据解释为json数据 - 并且当它试图解析可能是url编码的请求数据时会产生错误。

也许考虑以json格式发送数据。您必须设置请求标头以指示数据类型为json。请参阅此答案以获取示例:

Angular JS POST request not sending JSON data

答案 2 :(得分:0)

我刚刚在邮递员中创建了一个新会话,它开始工作了。我不确定是否有缓存效果但它现在有效。我根本没有做任何代码更改。现在将其作为解决方案发布。

答案 3 :(得分:0)

不要在你的JSON值上加上引号。

不是" okay2" ,只是 okay2

我认为邮递员如果需要自己添加引号,在这种情况下创建"" okay2""这不是有效的JSON。

顺便说一下,你可以点击"行"进行测试。单选按钮并编写自己的JSON。