【问题标题】:req.body is an empty object from simple HTML form using expressreq.body 是使用 express 的简单 HTML 表单中的空对象
【发布时间】:2020-01-30 21:30:30
【问题描述】:

当我提交我的 HTML 表单时,我得到了一个 req.body,但它始终是一个空对象。我正在邮递员中进行测试,并在浏览器中从本地主机提交表单。

当我将它登录到节点控制台时,它会显示 [Object: null prototype]

我已经阅读并尝试了所有(许多)针对类似问题提出的解决方案,但似乎没有一个适用。

非常感谢!

// homepage.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
    <link rel="stylesheet" href="homepage.css" />
  </head>
  <body>
    <h1 class="greeting">Sign Up // Sign In</h1>

    <div>
      <form
        action="http://localhost:3000/auth/signup"
        method="POST"
        class="inbox"
        id="sign-up-form-id"
        enctype="text/html"
      >
        <label for="sign-up-name-id">Sign Up: Name</label>
        <br />
        <input
          class="name"
          id="sign-up-name-id"
          name="signUpNameName"
          type="text"
          placeholder="your name here"
          required
        />
        <br />
        <label for="sign-up-password-id">Password</label>
        <br />
        <input
          class="password"
          id="sign-up-password-id"
          name="signUpPasswordName"
          type="password"
          placeholder="create a password"
          required
        />
        <br />
        <input class="btn" id="sign-up-btn" name="sign-up-btn" type="submit" />
      </form>
    </div>


    <script src="homepage.js"></script>
  </body>
</html>
// app.js

const createError = require("http-errors");
const express = require("express");
const path = require("path");
const cookieParser = require("cookie-parser");
const logger = require("morgan");
const sassMiddleware = require("node-sass-middleware");
const authRouter = require("./routes/auth");

const indexRouter = require("./routes/index");
// import other routers here like:
// const postsRouter = require('./routes/posts');

const app = express();



// view engine setup
app.set("views", path.join(__dirname, "views"));
app.set("view engine", "pug");

app.use(logger("dev"));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(
  sassMiddleware({
    src: path.join(__dirname, "public"),
    dest: path.join(__dirname, "public"),
    indentedSyntax: false, // true = .sass and false = .scss
    sourceMap: true
  })
);
app.use(express.static(path.join(__dirname, "public")));




app.use("/", indexRouter);
app.use("/auth", authRouter);
// add more routers here:
// app.use('/posts', postsRouter);

// catch 404 and forward to error handler
app.use((req, res, next) => {
  next(createError(404));
});

// error handler
app.use((err, req, res, next) => {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get("env") === "development" ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render("error");
});

module.exports = app;

routes/auth.js

const express = require("express");
const { createUser } = require("../controllers/auth-controller");

const router = express.Router();

router.post("/signup", createUser);

module.exports = router;
controllers/auth-controller.js

const User = require("../models/User");

// const seeIt = (req, res) => {
//   // const form = JSON.parse(JSON.stringify(req.body));
//   console.log(req.body);
// };

const createUser = (req, res) => {
  if (req.body) {
    console.log("here: ", req.body);
  }
  User.create(req.body, err => {
    if (err) res.status(500).json({ flash: err.message });
    else res.status(200).json({ flash: "User created!" });
  });
};

module.exports = { createUser };

【问题讨论】:

  • 为什么app.use(express.urlencoded({ extended: false }));注册了多次? json 解析器也是如此,您应该只注册一次。
  • 感谢@JakeHolzinger,在尝试百万次修复时添加了副本,并且在其他类似的 SO 问题上建议了一个修复 - 我忘了把它拿出来。现已编辑,谢谢指出。遗憾的是与问题无关。
  • 您确定请求到达了您期望的路线吗?您在更具体的路线(例如,app.use("/auth", ...))之前声明了一条捕获所有路线(例如,app.use("/", ...))。路线的顺序很重要。

标签: javascript html node.js express


【解决方案1】:

bodyParser 不再被 node js 使用

你应该只使用app.use(express.json());,它会为你处理所有的bodyParser工作,在此之下,这段代码只写一次

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

我注意到你在上面写了两次,请只写一次

我希望这对你有用

【讨论】:

  • 感谢 Ashir,根据我上面的评论,这些东西只是在最后一刻才添加的,同时尝试了太多修复。我现在将代码编辑回了我第一次遇到问题时的样子 - 遗憾的是它没有修复。
【解决方案2】:

? 你得到这样的东西的唯一一个原因:[Object: null prototype] 这是因为 {extended: false };

?‍? 现在,您尝试将extended 更改为true。例如,您可以查看以下代码:

app.use(express.urlencoded({ extended: true}));

我一直在尝试上面的代码,它工作正常

希望对你有帮助?。

【讨论】:

  • 非常感谢!那太棒了。终于到了!
猜你喜欢
  • 1970-01-01
  • 2013-02-25
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 2020-09-13
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多