【问题标题】:req.body returns undefined - nodejsreq.body 返回未定义 - nodejs
【发布时间】:2020-10-20 00:56:45
【问题描述】:

当我把 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; 

提前致谢!

【问题讨论】:

  • Express 会记住设置中间件(主体解析器、路由器等)的顺序,并以相同的顺序通过它们运行请求。路由及其处理程序不会自动优先处理最后一个。

标签: node.js express


【解决方案1】:

我们需要 body-parser 中间件来读取 req.body,

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

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

【讨论】:

    【解决方案2】:

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

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

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

    因此,当您在路由之后使用 bodyparser 中间件时,req.body 将不会被初始化,因为 bodyparser 中间件从未为路由运行并且响应以 res.send() 结束。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      相关资源
      最近更新 更多