В настоящее время я изучаю учебное пособие по внедрению сброса пароля из приложения node.js, и потребовалось, чтобы я использовал библиотеку async для очистки кода от обратного вызова , Я относительно новичок в Javascript и исхожу из более строго типизированных языков, таких как Java и Objective-C. У меня возникают проблемы с свободой, присущей языку.Как работают обратные вызовы в Javascript с async waterfall
В любом случае, я понимаю, как каждая предыдущая функция по существу передает значения до следующей функции через обратные вызовы, но мне трудно понять точку параметра «err» в начале каждого вызова обратного вызова. Например, в первой функции выполняется обратный вызов (err, токен), но следующая функция имеет токен в качестве своего первого параметра, а не err. Я изо всех сил пытаюсь понять, как следующая функция получает этот параметр токена и использует его, когда параметр «err» является тем, который указан в обратном вызове. Возможно, я ошибаюсь в понимании концепции или чего-то не хватает, поэтому любая помощь приветствуется.
app.post('/forgot', function (req, res, next) {
async.waterfall([function (done) {
crypto.randomBytes(20, function (err, buf) {
var token = buf.toString('hex');
done(err, token);
});
},
function (token, done) {
User.findOne({ email: req.body.email }, function (err, user) {
if (!user) {
return { error : 'No account with that email address exists'};
}
user.resetPasswordToken = token;
user.resetPasswordExpires = Date.now() + 3600000; //1 hour
user.save(function (err) {
done(err, token, user);
});
});
},
function (token, user, done) {
var smtpTransport = nodemailer.createTransport('SMTP', {
service: 'SendGrid',
auth : {
user: "swagboi",
pass: "woo"
}
});
var mailOptions = {
to: user.email,
from: '[email protected]',
text: 'You are receiving this because you (or someone else) have requested hte reset of the password for your account. \n\n' +
'Pleaes click on the following link, or paste this into your browser to complete the process: \n\n' +
'http://' + req.headers.host + '/reset/' + token + '\n\n' +
'If you did not request this, please ignore this email and your password will remain unchanged. \n'
};
smtpTransport.sendMail(mailOptions, function (err) {
done(err, 'done');
});
}
], function (err) {
if (err) return next(err);
})
});
Это прояснило все, я определенно неправильно понял использование. Большое вам спасибо за вашу помощь! – Coach