繁体   English   中英

如何在nodejs中使用promise更改异步回调?

[英]how to change async callback using promise in nodejs?

我是一个初学者,目前正在使用NodeJS制作用户管理系统,我以前是使用MongoDB Express来完成的。 现在,我通过Express,Sequelize和Postgresql再次进行了全部处理,以更好地理解一些概念。

我停留在复位页面上的是我以前使用Async.waterfall来获取电子邮件ID并使用SendGrid发送电子邮件的重置页面,但是现在我想知道如何使用Promises ..将其转换。 了解如何将它们与并发回调一起使用有点令人困惑。

这是先前使用async.waterfall的代码:

app.post('/forgotpassword', function(req, res, next) {
    async.waterfall([
        function(done) {
            crypto.randomBytes(20, function(err, buf) {
                var token = buf.toString('hex');
                done(err, token);
            });
        },
        //2
        function(token, done) {
            User.findOne({ 'local.email': req.body.email }, function(err, user) {
                if (!user) {
                    req.flash('forgotMessage', 'No account with that email address exists.');
                    return res.redirect('/forgotpassword');
                }

                user.local.resetPasswordToken = token;
                user.local.resetPasswordExpires = Date.now() + 3600000; // 1 hour

                user.save(function(err) {
                    done(err, token, user);
                });
            });
        },
        //3
        function(token, user, done) {

            var nodemailer = require('nodemailer');
            var sgTransport = require('nodemailer-sendgrid-transport');

            var options = {
                auth: {
                    api_key: ''
                }
            };

            var mailer= nodemailer.createTransport(sgTransport(options));

            var mailOptions = {
                to: user.local.email,
                from: 'passwordreset@demo.com',
                subject: 'Node.js Password Reset',
                text: 'You are receiving this because you (or someone else) have requested the reset of the password for your account.\n\n' +
                'Please 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'
            };
            mailer.sendMail(mailOptions, function(err) {
                req.flash('forgotMessage', 'An e-mail has been sent to ' + user.local.email + ' with further instructions.');
                done(err, 'done');
            });
        }
    ],
    //2 out of Async
    function(err) {
        if (err) return next(err);
        res.redirect('/forgotpassword');
    });
});

来自async.waterfall文档

依次运行一个函数数组,每个函数将其结果传递给数组中的下一个函数。 但是,如果有任何函数将错误传递给回调,则不会执行下一个函数,并且会立即以错误调用主回调。

因此,它与Promise完全相同,然后做,只是兑现您的诺言。

    crypto.randomBytes(20)
    .then( function (buf) {
         var token = buf.toString('hex');
         return token;
    })
    .then( function(token) {
       return Model.User.findOne({where: {'email' : req.body.email}});
    })
    .then(function (user) {
         if(!user){
            //    throw no user found error             
         }

         return Model.User.create();

    })
    .catch( function(err) { 
       // error handling
       // catch no user found error and show flash message
    });

您必须在Promise链的末尾具有单个catchthen不应位于另一个.then函数内部。 我可以建议阅读这篇文章- 我们对诺言有疑问

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM