2014-09-02 126 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