当我放入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;
谢谢!
答案 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