使用 router.post() 时 req.body 未定义,但使用 app.post() 时可见

req.body is undefined when use router.post() but visible when use app.post()

提问人:Enesan 提问时间:11/9/2023 更新时间:11/9/2023 访问量:29

问:

我有下一个:app.js

const express = require('express');
const bodyParser = require('body-parser');
const authRoutes = require('./routes/auth');
const app = express();

app.use(`$/api/auth`, authRoutes)

app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended: true}))

module.exports = app;

和:routes/auth.js

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

router.post("/register",  (req, res) =>{
    res.status(200).json(req.body);
})

因此,如果我尝试接受 auth.js,我会得到 ,如果我传递任何 json 而不是 req.body,它将正常工作。req.bodyundefined

另外,如果我移动到 ,它将看起来像这样:postapp.js

const express = require('express');
    const bodyParser = require('body-parser');
    const authRoutes = require('./routes/auth');
    const app = express();
    
    // app.use(`$/api/auth`, authRoutes)
    
    app.use(bodyParser.json())
    app.use(bodyParser.urlencoded({extended: true}))

    app.post("/api/auth/register", (req, res) =>{
        res.status(200).json(req.body)
    })
     
    module.exports = app;

它也可以正常工作。我没有看到什么?

节点.js 表示 未定义的 请求

评论

1赞 slebetman 11/9/2023
您在安装路由后安装了 bodyparser。在路由之前安装它。请注意,bodyparser 只是一个中间件,没什么特别的。
0赞 slebetman 11/9/2023
或者,这也将起作用: - 并且意味着同样的事情:在路由之前安装 bodyparser。只有这样,它才不是全局的,并且只为路由安装。请记住,bodyparser 只是一个常规的中间件,没什么特别的。app.use('$/api/auth', bodyParser.json(), bodyParser.urlencoded({extended: true}), authRoutes)
0赞 Enesan 11/9/2023
@slebetman非常感谢。还是不习惯,他们必须有一定的顺序
0赞 slebetman 11/9/2023
这很简单。所有中间件都按照安装顺序进行处理。没什么复杂的。Express 只是创建它们的堆栈/列表,并一次处理一个。此外,端点只是不调用 .Express 只有中间件。它没有任何不是中间件的东西。一切都是中间件。next()
0赞 slebetman 11/9/2023
另一个例子。如果有两个终结点,并且必须首先安装,因为也匹配字符串的保存位置/hello/world/hello/:message/hello/world/hello/world/hello/:messageworldreq.params.message

答:

0赞 Enesan 11/9/2023 #1

斯莱贝特曼在评论中给出了答案。

因此,由于 是中间件,它们取决于它处置的顺序。因此,我应该使用上述路由中间件放置行。app.use()bodyParser