2014-09-02 79 views
0

我app.js看起来是这样的:快速的NodeJS框架此关键字

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

session.verifyToken是一个自定义modue对Redis的数据库进行检查,看是否令牌已过期。

我为我的模块工作写的所有测试,所以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对象,而是是孔快递框架。

任何人都可以请解释为什么这个关键字关闭?

回答

2

当你通过session.verifyTokenapp.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); 
+0

TNX,我用.bind(会话),似乎有点更好的解决方案 – 2014-09-02 12:54:49

+0

我真的很喜欢的那优雅后一种方法。这正是我需要的。固体! – Dan 2014-09-30 01:02:21

+0

我有同样的问题,“绑定”修复它,不知道如何避免使用'绑定',thx很多 – 2016-02-06 07:12:42