nodemailer не работает await на transporter.verify()
Имеется код:
router.post(
'/register',
[
check('email', 'Некорректный email').isEmail(),
check('password', 'Минимальная длина пароля 6 символов').isLength({ min: 6 }),
check('name', 'Введите имя').exists(),
check('surname', 'Введите фамилию').exists(),
check('middle_name', 'Введите отчество').exists(),
check('email_password', 'Введите пароль от почты').exists()
],
async (req, res) => {
try {
const errors = validationResult(req)
if (!errors.isEmpty()) {
return res.status(400).json({
errors: errors.array(),
message: 'Некорректные данные при регистрации'
})
}
let {email, password, name, surname, middle_name, email_password, email_aggregator} = req.body
email = email.toLowerCase()
const data_email_aggregator = await getEmailAggregator(email_aggregator)
if(!data_email_aggregator){
return res.status(400).json({ message: 'Выберите почтового агрегатора из списка доступных' })
}
const candidate = await User.findOne({ email })
if (candidate) {
return res.status(400).json({ message: 'Такой пользователь уже существует' })
}
let transporter = await nodemailer.createTransport({
pool: true,
host: data_email_aggregator.smtp,
port: data_email_aggregator.port,
secure: true, // use TLS
auth: {
user: email,
pass: email_password
},
});
await transporter.verify((error, success) => {
if (error) {
return res.status(400).json({ message: 'Почта или пароль от почты введены неверно' })
}
})
const hashedPassword = await bcrypt.hash(password, 12)
const cryptEmailPassword = await CryptoJS.AES.encrypt(email_password, config.cryptoJS.secret).toString();
const user = new User({ email: email, password: hashedPassword, name, surname, middle_name, email_password: cryptEmailPassword, email_aggregator: email_aggregator })
await user.save()
res.status(201).json({ message: 'Пользователь успешно создан' })
} catch (e) {
res.status(500).json({ message: 'Что-то пошло не так, попробуйте снова' })
}
})
Проблема в этом кусочке кода
await transporter.verify((error, success) => {
if (error) {
return res.status(400).json({ message: 'Почта или пароль от почты введены неверно' })
}
})
Код просто пролетает, как будто его и нет тут вовсе. Пробовал явно создавать функцию на проверку verify. Обёртывал в new Promise(), но по истечении 60 секунд вылетала ошибка таймаута. В примере выше, даже если данные от аккаунта введены неправильно -- пользователь добавляется в базу.
Однако, если я запускаю test.js со следующим кодом:
const nodemailer = require('nodemailer'); //to send mails
let transporter = nodemailer.createTransport({
pool: true,
host: "smtp.gmail.com",
port: 465,
secure: true, // use TLS
auth: {
user: "Моя почта",
pass: "Неправильный пароль"
},
});
transporter.verify(function (error, success) {
if (error) {
console.log(error);
} else {
console.log(success);
}
});
То код с задержкой в секунду-две выдаёт ошибку
Ответы (1 шт):
Автор решения: Vladislav Sokolov
→ Ссылка
Извращённо получилось, но лучшего выхода не нашёл.
Код, который был ниже verify засунул в if(errors){}else{}
transporter.verify(async (error, success) => {
if (success) {
const hashedPassword = await bcrypt.hash(password, 12)
const cryptEmailPassword = await CryptoJS.AES.encrypt(email_password, config.cryptoJS.secret).toString();
const user = new User({ email: email, password: hashedPassword, name, surname, middle_name, email_password: cryptEmailPassword, email_aggregator: email_aggregator })
await user.save()
res.status(201).json({ message: 'Пользователь успешно создан' })
}else{
return res.status(400).json({ message: 'Почта или пароль от почты введены неверно' })
}
})