Сейчас я делаю веб-приложение с 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);
});
});
};