首页 > 解决方案 > body-parser 不起作用并且 req.body 返回空

问题描述

我有一个 ejs 模板,它有一个简单的表单,只有一个值:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Cambia email</title>
</head>
<body>
  <form action="/user/cambia-email" method="POST">
    <input type="text" name"email" id="email">
    <input type="submit" value="Modifica email">
  </form>
</body>
</html>

在我的 app.js 中,我尝试调用console.log(req.body),但它返回空的“{}”。这是我的 app.js 代码:

const fs = require("fs");
const express = require("express");
const jwt = require("jsonwebtoken");
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');
const { verifyToken, signToken, deleteToken } = require("./middleware/user-auth");
require("dotenv").config();

const app = express();

app.set("view engine", "ejs");
app.use(express.static("public"));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());

app.get("/user/cambia-email", verifyToken, (req, res) => {
  res.render("cambia-email");
});

app.post("/user/cambia-email", verifyToken, (req, res) => {
  console.log(req.headers);
  console.log(req.body);
  res.send("Hai richiesto la modifica dell'email. Sei autorizzato!");
});

app.get("/login", signToken, (req, res) => {
  res.send();
});

app.get("/logout", deleteToken, (req, res) => {
  res.send("Logout effettuato")
});

app.get("/user/profile", verifyToken, (req, res) => {
  const tema = req.user.tema;
  res.render("profile", { tema });
});

app.get("/user/message", verifyToken, (req, res) => {
  res.send("Sei autorizzato!");
});

app.listen(3000, () => console.log("Server in ascolto sulla porta 3000..."));

在其他问题中,很多人说要使用app.use(bodyParser.urlencoded({ extended: false })); 但没有任何改变。我也试过.json()但似乎没有任何改变。顺便说一句,我也尝试过 console.log(req.headers) 并返回:origin: 'http://localhost:3000', 'content-type': 'application/x-www-form-urlencoded'所以 urlencoded 应该工作,但它没有。有什么解决办法吗?谢谢

标签: javascriptnode.jspostejsbody-parser

解决方案


好的,我解决了我自己的问题。我为任何需要的人发布我的解决方案:基本上我在我的 ejs 文件中重写了我的表单,所以:

<form action="/user/cambia-email" method="post">
    <label form="email">Email:</label>
    <input type="text" name="email" id="email"><br><br>
    <input type="submit" value="Modifica email">
  </form>

问题是名称在 (name"email" 而不是 name="email") 之后没有等号。

我用来解析body的方式是:app.use(bodyParser.urlencoded({extended: false }));

我建议将 extended 设置为 true 以避免任何警告,但只有 body 的值。


推荐阅读