请求正文中的JSON数据未使用正文解析器进行解析

时间:2016-04-03 17:12:54

标签: node.js express body-parser

当我使用postman发送POST请求到localhost时:8080 / api / newUser请求正文:

{name: "Harry Potter"}

在服务器端,console.log(req.body)打印:

{ '{name: "Harry Potter"}': '' }

server.js

var express = require('express'); 
var app = express();
var router = express.Router();
var bodyParser = require('body-parser');

app.use('/', express.static(__dirname));

router.use(function(req, res, next) {
    next();
});

router
    .route('/newUser')
    .post(function(req, res) {
        console.log(req.body);
    });

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json()); // support json encoded bodies
app.use('/api', router);

app.listen(8080);

我做错了什么?

3 个答案:

答案 0 :(得分:11)

在express.js中,声明中间件的顺序非常重要。 bodyParser中间件必须早于您自己的中间件(api端点)定义。

var express = require('express'); 
var app = express();
var router = express.Router();
var bodyParser = require('body-parser');

app.use('/', express.static(__dirname));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json()); // support json encoded bodies

router
    .route('/newUser')
    .post(function(req, res) {
        console.log(req.body);
    });

app.use('/api', router);

app.listen(8080);

答案 1 :(得分:6)

更改请求标题

'Content-Type':'application/json'

因此bodyParser可以解析身体。

*这对我有用。我使用角度2+与快速(身体解析器)

答案 2 :(得分:0)

我花了很多时间试图弄清楚如何将 Axios 中的对象作为键值对传递,最终决定采用另一种方法,因为设置 Content-Type: "application/json" 会重新调整一个空对象。

如果上述选项不适合您,我会考虑:

  • 提取密钥(应该包含整个 对象)
  • 解析密钥
  • 访问新创建对象的值

这对我有用:

var obj = (Object.keys(req.body)[0])

var NewObj = JSON.parse(obj)

var name = apiWords["Key1"]

var image = apiWords["Key2"]