簡體   English   中英

發布請求后 req.body 未定義

[英]req.body is undefined after post request

我正在使用nodemailer構建聯系表格。

要發布它,我使用的是fetch API。

但由於某種原因,我得到req.bodyundefined

這是前端代碼:

form.onsubmit = function (e) {
  // Stop the regular form submission
  e.preventDefault();

  const name = document.querySelector("form#contactForm #name").value;
  const email = document.querySelector("form#contactForm #email").value;
  const textarea = document.querySelector("form#contactForm #textarea").value;

  // Collect the form data while iterating over the inputs
  var data = {};


  data = { name, email, textarea };

  console.log(data);

  fetch("/mail", {
    method: "POST", // or 'PUT'
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(data),
  })
    .then(async (response) => {
      if (response.ok) {
        return response.json();
      } else {
        const resJson = await response.json();
        console.log(resJson);

        if (typeof resJson.errors === "undefined") {
          formStatus.className += " alert-danger";
          formStatus.innerText =
            "An error occured, Please refresh the page. Or email us at ravchesed@kehilasbelz.be";
          return;
        }
        let ul = document.createElement("ul");
        resJson.errors.forEach((err) => {
          const li = document.createElement("li");
          li.innerText = `${err.msg}: ${err.param} `;
          ul.append(li);
          console.log(`${err.msg}: ${err.param} `);
        });

        formStatus.className += " alert-danger";

        formStatus.innerText = "";
        formStatus.append(ul);
        throw response;
      }
    })
    .then((data) => {
      console.log("Success:", data);
    })
    .catch((error) => {
      console.error("Error:", error);
    });

};

這是后端:

const express = require("express");
const app = express();

const bodyParser = require("body-parser");
const { check, validationResult } = require("express-validator");
const rateLimit = require("express-rate-limit");

const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minutes
  max: 10, // limit each IP to 100 requests per windowMs
});

//Here we are configuring express to use body-parser as middle-ware.
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

const mail = express.Router();

// app.post("/mail", (req, res) => {
//   console.log(req.body);
//   const result = {
//     hellop: 5
//   };
//   res.send(JSON.stringify(result));
// });

mail.post(
  "/mail",
  //   limiter,
  [
    // username must be an email
    check("email").trim().isEmail(),
    check("textarea").trim().isLength({ max: 6000 }),
    check("name").trim().isLength({ min: 2, max: 20 }),
  ],
  (req, res) => {
    
    console.log(req.body); //undefined

    // Finds the validation errors in this request and wraps them in an object with handy functions
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      console.log(errors); //this returns empty values.

      return res.status(422).json({ errors: errors.array() });
    }
    const mailInfo = {
      name: req.body.name,
      email: req.body.email,
      message: req.body.testarea,
    };
    main(mailInfo).catch(console.error);

    res.json({ success: true });
  }
);

const nodemailer = require("nodemailer");

// async..await is not allowed in the global scope, must use a wrapper
async function main(data) {


  // create reusable transporter object using the default SMTP transport
  let transporter = nodemailer.createTransport({
    host: "xxx.xxx.com",
    port: 587,
    secure: false, // true for 465, false for other ports
    auth: {
      user: "email@example.com", // generated ethereal user
      pass: "abc123456", // generated ethereal password
    },
  });

  // send mail with defined transport object
  let info = await transporter.sendMail(
    {
      from: '"John Doe 👍" <robot@Doe.dev>', // sender address
      to: "Doe@gmail.com", // list of receivers
      subject: `📧 Mail from ${data.name}`, // Subject line

      html: `
      <b>${data.name}, ${data.email}</b><br>
      Phone: ${data.phone}<br>
      
      <br>
      Message:
      <br>
      ${data.message}
      `, // html body
    },
    function (err, info) {
      if (err) console.log(err);
      else console.log(info);
      console.log("Message sent: %s", info);
    }
  );
}

module.exports = mail;

看了很多帖子,但這似乎是一個不同的問題。

再次查看所有內容后,我知道我的錯誤在哪里,但不明白為什么。

我的文件結構是這樣的:

app.js
mail.js

mail.js被導入到app.js中,如下所示:

//handle mail
const mail = require("./mail");
app.use(mail);

app.js中,我沒有導入body-parser和中間件,因為它已經在mail.js中導入了。

但看起來由於某種原因,我還必須在app.js之前將其導入mail.js

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM