我的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();
但是,当请求通过express传入时,我在此行上会收到500内部错误。
var token = this.extractToken( req.headers['authorization'] );
问题是,this
关键字的范围是完全关闭的,在范围内应该只有我的RedisSessions对象,而是孔快速框架。
任何人都可以解释为什么关闭此关键字?
答案 0 :(得分:2)
当您将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);