Я создаю токен для Add User, который отправляет электронное письмо пользователю с сгенерированным токеном. Проблема в том, что он не работает 100% времени, и токен иногда рассматривается как нулевое значение.
Ошибка:
TypeError: Cannot set property 'confirmRegisterToken' of null
Код:
waterfall([
function(done) {
crypto.randomBytes(20, function(err, buf) {
token = buf.toString('hex');
done(err, token);
});
},
function(token, done) {
User.findOne({ email: email }, function(err, user) {
console.log("USER FINDONE - TOKEN");
if(token === null) {
console.log("token is null");
}
user.confirmRegisterToken = token;
console.log("user.confirmRegisterToken: " + user.confirmRegisterToken);
user.isConfirmed = false;
user.save(function(err) {
done(err, token, user);
});
});
},
function(token, user, done) {
console.log("SMTP TRANSPORT - TOKEN");
var smtpTransport = nodemailer.createTransport({
service: 'Gmail',
auth: {
user: process.env.EMAIL,
pass: process.env.EMAIL_PW
}
});
var mailOptions = {
to: user.email,
from: process.env.EMAIL,
subject: '[redacted]',
text: 'Click on the link to confirm your registration.' +
'http://' + req.headers.host + '/confirm/' + token + '\n\n' +
'This token expires in 24 hours!' +
'Your generated password is your given firstname and surname (no space & case sensitive)'
};
smtpTransport.sendMail(mailOptions, function(err) {
console.log('Mail sent');
res.redirect('/admin/adduser');
done(err, done, token);
});
}
], function(err) {
if(err) return next(err);
res.redirect('/admin/adduser');
done();
});
Я дал примерную попытку из 10 попыток, и она работает 50% времени (как ни странно). Может быть, это что-то про asyn c и как оно работает, но я не уверен, поэтому мне нужна помощь для этого.