req.body 在安装 express-static-gzip 后未定义

req.body is undefined after installing express-static-gzip

我最近向我的服务器添加了 express-static-gzip,此后我注意到在提交表单时我的 req.body 在我的 router.post 中未定义。

以前它没有问题,但现在我收到 POST 500 内部服务器错误,无法读取 属性 未定义的“名称”和未捕获(承诺)语法错误:意外令牌 < in JSON 在位置 0 错误。

这是我提交的表单:

const handleSubmit = async (e) => {
    
    e.preventDefault();
    setStatus("Sending...");
    const { name, email, message } = e.target.elements;
    let details = {
        name: name.value,
        email: email.value,
        message: message.value,
    };
    console.log(typeof JSON.stringify(details))
    let response = await fetch("/api/v1/mail", {
        method: "POST",
        headers: {
            "Content-Type": "application/json;charset=utf-8"
        },
        body: JSON.stringify(details),
    });
    setStatus("Send Message");
    let result = await response.json();
    alert(result.status);
};

这是我的服务器设置,有问题的路由是“/api/v1/mail”:

const express = require('express')
const path = require('path')
const router = express.Router();
const cors = require("cors");

var expressStaticGzip = require("express-static-gzip")

const mailRoutes = require('./routes/mail');

const server = express()

server.use('/api/v1/mail', mailRoutes)
server.use(cors())
server.use(express.json())
server.use("/", router)
server.use(expressStaticGzip(path.join(__dirname, 'public'), {
  enableBrotli: true
}))

server.use(express.static(path.join(__dirname, 'public')))

这是我的 POST 请求:

       router.post("/", (req, res) => {
  const name = req.body.name;
  const email = req.body.email;
  const orderId = req.body.orderId
  const message = req.body.message; 
  const mail = {
    from: name,
    to: "info@example.com ",
    subject: "Contact Form Submission",
    html: `<p>Name: ${name}</p>
           <p>Email: ${email}</p>
           <p>Order ID: ${orderId}
           <p>Message: ${message}</p>`,
  };
  contactEmail.sendMail(mail, (error) => {
    if (error) {
      res.json({ status: "ERROR" , req});
    } else {
      res.json({ status: "Message Sent" });
    }
  });
});

})

如果您尝试使用 req.body.name 的路线是这条路线:

server.use('/api/v1/mail', mailRoutes)

那么,你要搬这个:

server.use(express.json())

在路由定义之前。

事实上,您正在尝试在您的中间件读取并解析 JSON 之前处理路由请求。路由处理程序和中间件按照它们注册的顺序进行匹配和执行。因此,任何需要为路由处理程序运行而执行的中间件都必须在路由处理程序本身注册之前注册。