2014-09-02 4 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가 레디 스의 DB는 토큰이 만료되었는지 확인하기 위해 사용자 정의 modue입니다.

모질라에서 테스트 할 때 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, 나는 조금 더 나은 솔루션 –

+0

정말 그 우아함 것 같다 (세션) .bind 사용 후자의 방법. 이것은 내가 필요한 것입니다. 고체! – Dan

+0

나는 동일한 문제가 있고, 그것을 "묶는"고정 사용 궁금해하는 방법을 알고 사용 '바인딩', 많이 thx –

관련 문제