node js回调函数问题

时间:2018-01-24 07:06:07

标签: javascript node.js express callback

我是在节点js中开发apis的新手。最近我开始研究节点js应用程序,我使用jwt令牌进行身份验证。

我的jwt验证功能如下所示

var jwt = require('jsonwebtoken');
var config = require('../config.js')

var JwtValidations = {


    //will validate the JTW token
    JwtValidation: function(req, res, next, callback) {

        // check header or url parameters or post parameters for token
        var token = req.body.token || req.query.token || req.headers['x-access-token'];

        // decode token
        if (token) {
            // verifies secret and checks exp
            jwt.verify(token, config.secret, callback);

        } else {
            // if there is no token
            // return an error
            return res.status(403).send({
                success: false,
                message: 'No token provided.'
            });

        }



    }


}
module.exports = JwtValidations;

这个函数我正在传递一个回调函数,这样如果jtw令牌验证通过,我可以服务于请求。 bellow是将用户添加到系统的一个示例

// addmin a user to the database
router.post('/add', function(req, res, next) {

    JwtValidations.JwtValidation(req, res, next, function(err, decoded) {
        if (err) {
            return res.json({ success: false, message: 'Failed to authenticate token.' });
        } else {
            retrunval = User.addUser(req.body);
            if (retrunval === true) {
                res.json({ message: "_successful", body: true });
            } else {
                res.json({ message: "_successful", body: false });
            }
        }
    })

});

// addmin a user to the database
router.put('/edit', function(req, res, next) {
    JwtValidations.JwtValidation(req, res, next, function(err, decoded) {
        if (err) {
            return res.json({ success: false, message: 'Failed to authenticate token.' });
        } else {
            User.UpdateUser(req.body, function(err, rows) {
                if (err) {
                    res.json({ message: "_err", body: err });
                } else {
                    res.json({ message: "_successful", body: rows });
                }
            });
        }
    })
});

正如你在这两个函数中看到的那样,我正在重复相同的代码段

return res.json({ success: false, message: 'Failed to authenticate token.' });

当且仅当JwtValidations.JwtValidation不包含任何错误时,我如何避免这种情况并调用回调函数

2 个答案:

答案 0 :(得分:2)

  

当且仅当JwtValidations.JwtValidation不包含任何错误时,我如何避免这种情况并调用回调函数

只需在回调之上处理它,无论是在JwtValidations.JwtValidation本身还是在你回调周围的包装器。

如果您是在JwtValidations.JwtValidation本身进行的,那么您可以在调用回调的地方执行此操作:

if (token) {
    // verifies secret and checks exp
    jwt.verify(token, config.secret, function(err, decoded) {
        if (err) {
            return res.json({ success: false, message: 'Failed to authenticate token.' });
        }
        callback(decoded);
    });
} else /* ... */

现在,当您使用它时,您知道要么使用成功解码的令牌获得回调,要么根本不会收到回调,但会为您发送错误响应:

router.put('/edit', function(req, res, next) {
    JwtValidations.JwtValidation(req, res, next, function(decoded) {
        User.UpdateUser(req.body, function(err, rows) {
            if (err) {
                res.json({ message: "_err", body: err });
            } else {
                res.json({ message: "_successful", body: rows });
            }
        });
    })
});

上面的代码使用了很多(旧式)NodeJS回调。这绝对没问题,但如果您使用promises,您可能会发现编写一些代码更简单。其中一个有用的功能是将返回路径分成两部分,一部分用于正常分辨率,一部分用于错误(拒绝)。

答案 1 :(得分:1)

使用jwt身份验证功能作为中间件功能而不是路由,快速文档中有大量示例。 http://expressjs.com/en/guide/using-middleware.html