Отправлять электронную почту в nodejs с помощью nodemailer и возвращать представление, не дожидаясь успешного отправления электронной почты? - PullRequest
0 голосов
/ 10 марта 2020

Сейчас я делаю веб-приложение с Nodejs, Express, MongoDB и Nodemailer. Сценарий заключается в том, что когда пользователь делает запрос на регистрацию, он получает электронное письмо, содержащее ссылку для подтверждения. Я использовал NodeMailer, чтобы отправить электронное письмо, а затем проверить, было ли оно успешно отправлено, чтобы вернуть указанное представление c в представление. Если это не удастся, адрес электронной почты будет удален из mongodb. Все коды выполняются асинхронно, поэтому пользователь должен ждать, пока они не будут завершены. Теперь я хочу вернуть пользователю представление сразу после отправки события sendemail, но такие вещи, как проверка электронной почты, отправленная успешно, удаление неудачной электронной почты, по-прежнему работают в фоновом режиме. Надеюсь, вы, ребята, можете мне помочь.

//sendmail function

import nodemailer from 'nodemailer';

let adminEmail = process.env.MAIL_USER;
let adminPassword = process.env.MAIL_PASSWORD;
let mailHost = process.env.MAIL_HOST;
let mailPort = process.env.MAIL_PORT;

let sendMail = (to, subject, htmlContent) => {
  let transporter = nodemailer.createTransport({
    host: mailHost,
    port: mailPort,
    secure: false, //
    auth: {
      user: adminEmail,
      pass: adminPassword
    }
  });

  let options = {
    from: `Demo Mailer <${adminEmail}>`,
    to: to,
    subject: subject,
    html: htmlContent
  };

  return transporter.sendMail(options)
}

module.exports = sendMail;

//authService for handling register request
import bcrypt from 'bcrypt';
import uuid from 'uuid/v4';
import UserModel from '../models/userModel';
import { transError, transSuccess, transMail } from '../../lang/vi';
import sendMail from '../config/mailer';

const saltRounds = 7;
const register = (email, gender, password, protocol, host) => {
  return new Promise(async (resolve, reject) => {
    const user = await UserModel.createNew(userItem);
    const linkVerify = `${protocol}://${host}/verify/${user.local.verifyToken}`;
    sendMail(email, transMail.subject, transMail.template(linkVerify))
      .then(() => {
        return resolve(transSuccess.account_created(user.local.email));
      })
      .catch(async () => {
        await UserModel.removeById(user._id);
        return reject(transMail.send_failed);
      });
  });
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...