Выпуск
У меня возникают проблемы при попытке отправить электронное письмо с NodeMailer после сохранения некоторых данных в файл с помощью модуля fs.
* 1005 Сводка *
У меня есть маршрут API, который принимает некоторые очень простые данные JSON:
{
"name": "Some Name",
"email": "example@gmail.com",
"linkedIn": "https://linkedin.com/38473289472",
"comments": ""
}
Когда мой маршрут получает эти данные, он пытается сохранить эти данные в файл JSON. Он делает это, читая текущий файл JSON, чтобы увидеть, существует ли человек, и если нет, он записывает в файл.
Это прекрасно работает, но моя проблема в том, когда я пытаюсь отправить электронное письмо после того, как происходит этот процесс. Вот код в полном объеме:
const fs = require('fs');
const nodemailer = require('nodemailer');
const transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'myemail@email.com',
pass: 'somecoolpassword',
},
});
const mailOptions = {
from: 'myemail@email.com',
to: 'myemail@email.com',
subject: 'subject',
html: `test`,
};
// This is the route
exports.register = async (req, res) => {
try {
await addApplicant(req.body);
await transporter.sendMail(mailOptions); // Does not send
res.sendStatus(200);
} catch (err) {
res.send(err);
}
};
const addApplicant = async applicant => {
return new Promise(async (resolve, reject) => {
fs.readFile('./applicants/applicants.json', 'utf8', async (err, data) => {
if (err)
reject('There was an error accessing the applicants master file.');
const allApplicants = JSON.parse(data);
if (allApplicants.hasOwnProperty(applicant.email)) {
reject('User already exists.');
}
const updatedApplicants = JSON.stringify({
...allApplicants,
[applicant.email]: { ...applicant },
});
await writeToJsonFile(updatedApplicants);
resolve();
});
});
};
const writeToJsonFile = async updatedApplicants => {
return new Promise(async (resolve, reject) => {
fs.writeFile('./applicants/applicants.json', updatedApplicants, err => {
if (err) reject('There was an error saving the applicants information');
resolve();
});
});
};
Если я изменю маршрут регистрации для отправки электронного письма ДО того, как я начну использовать файловую систему, он отправляет электронное письмо и выполняет надлежащие операции с файлами.
exports.register = async (req, res) => {
try {
await transporter.sendMail(mailOptions); // works
await addApplicant(req.body);
res.sendStatus(200);
} catch (err) {
res.send(err);
}
};
Что я здесь не так делаю? Честно говоря, это должно быть что-то настолько тривиальное, но я просто сейчас не вижу этого.