【问题标题】:node js callback function issue节点js回调函数问题
【发布时间】:2023-03-23 04:22:01
【问题描述】:

我是在节点 js 中开发 api 的新手。最近我开始在一个节点 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 令牌验证通过,我可以为请求提供服务。下面是向系统添加用户的一个示例

// 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 不包含任何错误时,我如何避免这种情况并调用回调函数

【问题讨论】:

    标签: javascript node.js express callback


    【解决方案1】:

    当且仅当 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,您可能会发现编写代码位更简单。有用的事情之一是将返回路径一分为二,一个用于正常分辨率,一个用于错误(拒绝)。

    【讨论】:

    • 感谢您的成功。另外,如果您能告诉我这是否是正确的做法,那就太好了。
    • @pavithrarox:我无法具体谈谈 JWT 身份验证部分。不过,我同意Daniel Netzer's answer 将其用作中间件而不是在每个路由端点中。
    • 非常感谢。我也会调查的。
    【解决方案2】:

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

    【讨论】:

    • 顺便说一句,如果您想在每个请求上验证 JWT,则将其设为 MW 函数允许您在更多路由上添加此特定函数,这通常发生在具有各种身份验证的服务器上.
    猜你喜欢
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 2019-03-06
    • 2016-07-15
    相关资源
    最近更新 更多