【问题标题】:req.body is undefined but body-parser but it is inslatedreq.body 是未定义的但 body-parser 但它是 inslated
【发布时间】:2021-06-18 00:45:11
【问题描述】:

我创建了一个 api,为此我正在使用 node.js。每当我发出发布请求时,即使在正确传递数据后,我也会收到一个验证错误,指出这些字段为空。我做了一个检查,我注意到 req.body 是未定义的,甚至安装并导入了 body-parser 我正在使用 body-parser: 1.19.0

我已经安装了 body-parser 并使用了。

//Index.js
const express = require("express");
const app = express();
const mongoose = require("mongoose");
const dotenv = require("dotenv");
const bodyParser = require("body-parser");
//Import Router
const authRoute = require("./routes/auth");

dotenv.config();

//Import Router Middlewares
app.use("/api/user/", authRoute);

//MiddleWare
app.use(express.json());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));


mongoose
  .connect(process.env.DB_MONGO, {
    useNewUrlParser: true,
    useCreateIndex: true,
    useUnifiedTopology: true,
    useFindAndModify: false,
  })
  .then(() => {
    console.log("DB is connect");
  })
  .catch((err) => {
    console.log(err);
  });

app.listen(8081, () =>
  console.log("Servier is running  http://localhost:8081")
);


这是 auth.js

const router = require("express").Router();
const User = require("../model/User");

//post method
router.post("/register", async (req, res) => {
  const user = new User(req.body);
  console.log(req.body);
  user.save((err, data) => {
    if (err) {
      console.log(err);
      res.status(400).json({
        message: err,
      });
    } else {
      res.json({
        message: data,
        status: true,
      });
    }
  });
});

【问题讨论】:

标签: node.js


【解决方案1】:

您需要修正中间件相对于依赖它的路由的顺序。

改变这个:

//Import Router Middlewares
app.use("/api/user/", authRoute);

//MiddleWare
app.use(express.json());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

到这里:

//MiddleWare
app.use(express.json());
app.use(express.urlencoded({ extended: false }));

//Import Router Middlewares
app.use("/api/user/", authRoute);

然后,删除这个:

const bodyParser = require("body-parser");

这里的顺序很重要。你的中间件必须在需要它的路由之前。

另外,请注意,不再需要单独的 body-parser 模块,因为 Express 已经在内部包含 body-parser 模块,您可以通过 express.json()express.urlencdoed() 和其他方式访问它。

【讨论】:

    【解决方案2】:

    添加这一行兄弟:

    app.use(express.urlencoded({ extended: false }))
    

    【讨论】:

    • OP 已经有 app.use(bodyParser.urlencoded({ extended: false })); 提供类似的功能。
    • 我用它成功接收req.body
    • 是的,但这不是这里的问题,因为 OP 已经安装了用于读取正文的中间件。有关问题的描述,请参阅我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多