Когда я делаю запрос к своей конечной точке, мне нужно получить успешный ответ, только если электронное письмо будет отправлено! в противном случае он должен выдать ошибку:

Myendpoint.js

    router.post("/", upload.none(), async (req, res) => {
    try {
    let body = JSON.parse(req.body.contact);

    await getDb("messages").insertOne({
      name: body.name,
      email: body.email,
      phone: body.phone,
      subject: body.subject,
      message: body.message,
    });

    await sendEmail(body);

    res.send(
      JSON.stringify({
        success: true,
        msg: "Message has been sent successfully",
      })
    );
  } catch (err) {
    res.send(JSON.stringify({ success: false, msg: err }));
  }
});

SendEmail.js

    const sendEmail = async function (props) {
    const transporter = nodemailer.createTransport({
    service: process.env.EMAIL_SERVICE,
    host: process.env.EMAIL_HOST,
    auth: {
      user: process.env.EMAIL_FROM,
      pass: process.env.EMAIL_PASS,
    },
  });
  const mailOptions = {
    from: process.env.EMAIL_FROM,
    to: process.env.EMAIL_TO,
    name: props.name,
    email: props.email,
    phone: props.phone,
    subject: props.subject,
    text: props.message,
  };
  transporter.sendMail(mailOptions, function (error, info) {
    if (error) {
      throw new Error("Message did Not send!");
    }
  });
};

Проблема до "await sendEmail (body);" заканчивается, и я получаю сообщение об ошибке «Сообщение успешно отправлено», а затем происходит сбой сервера! что мне не хватает?

0
A Zarqam 29 Авг 2020 в 18:04

2 ответа

Лучший ответ

Здравствуйте, вы можете изменить свой Transporter sendMail на:

return await transporter.sendMail(mailOptions);

Или вы можете использовать обещание.

0
Omar Berrami 29 Авг 2020 в 15:27

Проверьте функцию документа sendMail из nodemailer на здесь

Если аргумент обратного вызова не задан, метод возвращает объект Promise. Сам Nodemailer не использует Promises внутри, но для удобства оборачивает возврат в Promise.

const sendEmail = async function (props) {
    const transporter = nodemailer.createTransport({
        service: process.env.EMAIL_SERVICE,
        host: process.env.EMAIL_HOST,
        auth: {
            user: process.env.EMAIL_FROM,
            pass: process.env.EMAIL_PASS,
        },
    });
    const mailOptions = {
        from: process.env.EMAIL_FROM,
        to: process.env.EMAIL_TO,
        name: props.name,
        email: props.email,
        phone: props.phone,
        subject: props.subject,
        text: props.message,
    };
    // remove callback and function sendMail will return a Promise
    return transporter.sendMail(mailOptions);
};
0
Chuong Tran 29 Авг 2020 в 15:26