req.body返回未定义-nodejs

时间:2020-10-19 16:15:19

标签: node.js express

当我放入app.use(bodyParser.json()); 以下以下app.use('/ api',require('./ routes / api')) req.body返回未定义。但是如果我把app.use(bodyParser.json()); 上方 app.use('/ api',require('./ routes / api'));它正确返回。所以问题是为什么?

这是我的代码: index.js文件

const express = require('express');
const app = express();
const bodyParser= require('body-parser');

app.use(bodyParser.json());

app.use('/api', require('./routes/api'));

app.listen(process.env.port || 3000, function(){
    console.log('You are listening to port 3000'); 
}); 

api.js文件


const express= require('express');
const router= express.Router();

router.get('/ninjas', function(req, res){
    res.send({type: 'GET'});
});

router.post('/ninjas', function(req, res){
    console.log(req.body);
    res.send({type: 'POST'});
});

router.put('/ninjas/:id', function(req, res){
    res.send({type: 'PUT'});
});

router.delete('/ninjas/:id', function(req, res){
    res.send({type: 'DELETE'});
});

module.exports =router; 

谢谢!

2 个答案:

答案 0 :(得分:0)

我们需要body-parser中间件才能从req.body中读取

在Javascript代码中,逐行执行(用于非IO操作)。

因此,当您在需要路由器文件逻辑之后放置app.use(bodyParser.json())时,不会调用和插入body-parser,因此您需要在其他任何逻辑之前调用它,以便可以从中读取请求。

答案 1 :(得分:0)

Bodyparser是一个中间件,应该在每次访问路由时都运行。 中间件(如bodyparser)是这样写的

const middleware = (req, res, next) => {
//some code here
next();
}

next函数开始执行另一个中间件函数

因此,在路由req.body之后使用bodyparser中间件时,将不会初始化,因为bodyparser中间件从未针对该路由运行,并且响应以res.send()结尾。 / p>

但是,如果您在初始化路由之前使用bodyparser中间件,则bodyparser中间件将始终运行。

您可以在expressjs文档中看到有关中间件的更多示例 https://expressjs.com/en/guide/using-middleware.html