req.тело не определено после установки express-static-gzip

#express #post #gzip #router #brotli

Вопрос:

Недавно я добавил express-static-gzip на свой сервер и с тех пор заметил, что мой req.body не определен в моем router.post при отправке формы.

Ранее это работало без проблем, но теперь я получаю внутреннюю ошибку сервера POST 500, свойство «имя» Не может быть прочитано с неопределенным и неперехваченным (в обещании) синтаксическим ошибком: Неожиданный токен

вот моя форма подачи:

 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/почта».:

 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')))
 

и вот мой почтовый запрос:

        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" });
    }
  });
});

})
 

Комментарии:

1. Каков тип содержимого при отправке формы?

2. Какой маршрутизатор является проблемой: server.use('/api/v1/mail', mailRoutes) или server.use("/", router) ?

3. Почему ты написал и исчез? Мы пытаемся помочь вам, но вы ушли, поэтому не можете прояснить то, что неясно. Это не то, как вы должны использовать Stackoverflow. Не публикуйте и не исчезайте. Побудьте здесь, по крайней мере, следующие 30-45 минут, несколько раз проверяя, есть ли у людей уточняющие вопросы. Публикуйте только тогда, когда вы можете поболтаться и проверить еще много раз. Вот как вы взаимодействуете с людьми, которые пытаются помочь. Люди редко задают правильные вопросы — поэтому нам часто нужна помощь в понимании вашей проблемы. Если ты уйдешь, то просто потеряешь свой шанс на помощь.

4. Привет, очень сожалею, что не ответил раньше, больше такого не повторится! Я отредактировал сообщение с более подробной информацией о форме отправки запроса на публикацию, в которой выделены тип контента и конкретный маршрутизатор соответственно. Спасибо

5. Хорошо, это похоже на проблему с заказом промежуточного программного обеспечения — см. Мой ответ ниже.

Ответ №1:

Если маршрут, который вы пытаетесь использовать req.body.name , — это этот:

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

Затем вы должны переместить это:

 server.use(express.json())
 

чтобы быть ДО этого определения маршрута.

Как бы то ни было, вы пытаетесь обработать запрос маршрута до того, как ваше промежуточное программное обеспечение прочитает и проанализирует JSON. Обработчики маршрутов и промежуточное программное обеспечение сопоставляются и выполняются в том порядке, в котором они зарегистрированы. Таким образом, любое промежуточное программное обеспечение, которое необходимо выполнить для функционирования обработчика маршрута, должно быть зарегистрировано до регистрации самого обработчика маршрута.