Я создаю веб-приложение для управления курсами. У меня есть mongodb со всеми моими выпускниками, их электронной почтой и их регистрационным идентификатором. Я хочу отправить id на их почту. У меня есть шаблон html, а затем с помощью функций fs.readfile и .replace() я заменяю заполнители реальной информацией, которую хочу отправить.
async function sendMail(mail,idreg){
var html_template;
const dataReg = "12/02/2019";
const oraReg = "16:00";
console.info(mail,idreg)
fs.readFile("./html_template/beefree-9o6bg29htfb.html",(err,data)=>{
html_template = data.toString().replace("XYZXYZXYZ",idreg).replace("XX/YY/ZZZZ",dataReg).replace("XX:YY",oraReg);
});
// Generate test SMTP service account from ethereal.email
// Only needed if you don't have a real mail account for testing
let account = await nodemailer.createTestAccount();
// create reusable transporter object using the default SMTP transport
let transporter = nodemailer.createTransport({
host: "smtp.gmail.com",
port: 465,
secure: true, // true for 465, false for other ports
auth: {
user: "[email protected] ", // generated ethereal user
pass: "mypw" // generated ethereal password
}
});
// setup email data with unicode symbols
let mailOptions = {
from: '"Cogestione Moscati" <[email protected]>', // sender address
to: mail, // list of receivers
subject: "Il tuo codice di registrazione per la Cogestione", // Subject line
html: html_template // html body
};
// send mail with defined transport object
let info = await transporter.sendMail(mailOptions)
console.info("Message sent: %s", info.messageId);
}
Проблема в том, что я отправил 8 раз одно и то же письмо. 4 раза я получил правильно, 4 раза я получил без тела.





Код под вашим вызовом fs.readFile не предоставляется как часть обратного вызова этой функции. По сути, чтение файла запускается, и остальная часть кода начинает выполняться, что приводит к гонке за создание html_template до отправки электронного письма.
Два решения:
fs.readFileSync, синхронный эквивалент.Кроме того, поскольку вы используете async/await, вы также можете просто использовать let data = await fs.readFile("path/to/file");.
редактировать. Я понял, что вы имели в виду под «Расширить обратный вызов». отлично работает. Это не ошибка, которую я обычно делаю, потому что я вручную пишу код. В этом случае я скопировал из документов. Спасибо чувак! @том-марш
let html_template = await fs.readFile("./html_template/beefree-9o6bg29htfb.html",(err,data)=>{ return data.toString().replace("XYZXYZXYZ",idreg).replace("XX /YY/ZZZZ",dataReg).replace("XX:YY",oraReg); });