【问题标题】:nodejs Express framework this keywordnodejs Express 框架 this 关键字
【发布时间】:2014-09-02 19:59:44
【问题描述】:

我的 app.js 看起来像这样:

var expressJwt = require('express-jwt');
var session = require('redis-sessions');
app.use('/events', expressJwt({secret: secret}), session.verifyToken, events);

session.verifyToken 是 redis db 的自定义模式,用于检查令牌是否已过期。

我为我的模块工作编写的所有测试,所以当我从 mocha 测试它时 session.verifyToken 工作。

//verifyToke function        
RedisSessions.prototype.verifyToken = function(req, res, next){
    var token = this.extractToken( req.headers['authorization'] );
this.containsToken(token, function(err, contains){
    if(contains == 1){
        next();
    }else{
        res.send(401);
    }
});
}

最后我像这样导出我的 RedisSession 模块:

module.exports = new RedisSessions();

但是,当请求通过快递进来时,我在这一行收到 500 内部错误。

var token = this.extractToken( req.headers['authorization'] );

问题是,this 关键字的作用域完全关闭了,作用域内应该只有我的 RedisSessions 对象,而是孔表达框架。

谁能解释一下为什么 this 关键字关闭了?

【问题讨论】:

    标签: node.js express node-modules


    【解决方案1】:

    当您像这样将session.verifyToken 传递给app.use() 时,您传递的是裸函数。它没有绑定任何上下文。

    这里有两个解决方案来解决这个问题:

    function verifyToken(req, res, next) {
      session.verifyToken(req, res, next);
    }
    app.use('/events', expressJwt({secret: secret}), verifyToken, events);
    

    app.use('/events', expressJwt({secret: secret}), session.verifyToken.bind(session), events);
    

    【讨论】:

    • tnx,我使用了.bind(session),似乎更好的解决方案
    • 我真的很喜欢后一种方法的优雅。这正是我所需要的。扎实!
    • 我有同样的问题,“绑定”修复了它,不知道如何避免使用“绑定”,谢谢很多
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2019-11-18
    • 2013-11-08
    • 1970-01-01
    • 2018-05-07
    相关资源
    最近更新 更多