2013-04-12 7 views
4

내가 사이트의 일부에 대한 액세스를 방지해야 인증 미들웨어 추가하려고 해요 :제어 명령/연결 미들웨어

이/API를 호출
app = express() 
    .get('/api/test', function (req, res) { ... }) 
    .use('/api', function (req, res, next) { 
     if (req.param('key')) { 
      next(); 
     } else { 
      res.json(401, { 
       message : 'Authentication failed' 
      }); 
      res.end(); 
     } 
    }) 
    .get('/api/data', function (req, res) { ... }); 

그리고 내 기대/데이터가 먼저 처리됩니다 키 검사기로 검사 한 다음/api/data 핸들러로 검사합니다 (성공할 경우). 대신 '/ api/data'에 의해 처리 된 요청이 먼저 처리됩니다.

검사기가/api/something_that_does_not_exist에는 작동하지만/api/something_that_exist에는 작동하지 않는 것으로 보입니다.

아마도 express/connect 문서에서 뭔가를 놓쳤을 수 있습니까?

업데이트 나는 첫 번째 get/post 호출이 라우터 미들웨어를 초기화하여 먼저 실행된다는 사실을 추적했다.

+1

테스트 할 때 작동해야하며 (Express 3.1.1과 함께) 테스트합니다. – robertklep

+0

감사합니다. 코드 예제는 실제 코드에서 발췌 한 것이며 일부 경로를 추가 한 누락 된 중요한 부분을 보여줍니다. _before_ this 특정 .use –

+0

아아아, 나는 이미 라우터 미들웨어라는 사실을 발견했습니다. 그것으로 괜찮아요. 나는 대답을 그대로 남겨두고, 다른 누군가를 도울 수 있습니다. – robertklep

답변

5

경로를 선언하면 Express는 해당 지점의 미들웨어 스택에 router 미들웨어를 삽입하여 앱을 설정합니다.

키 확인 미들웨어를 삽입하기 전에 .get('/api/test', ...)을 삽입하기 때문에 라우터 미들웨어가 삽입되고 우선 적용됩니다 (나중에 선언 한 /api/data 경로에도 해당). 그러면 키 검사기가 호출되지 않습니다.

// separate middleware, used for all routes that need checking 
var keyChecker = function(req, res, next) { 
    ... 
}; 
app.get('/api/test', function(req, res) { ... }); 
app.get('/api/data', keyChecker, function(req, res) { ... }); 

// or, as an alternative, create a 'catch-all' route between the routes that don't 
// need to be checked, and the ones that should; this will also match non-existing 
// routes (like '/api/foobar'), which might or might not be an issue; 
app.get('/api/test', function(req, res) { ... }); 
app.all('/api/*', function(req, res, next) { // 'all' means 'all methods' 
    // keychecker code 
}); 
app.get('/api/data', function(req, res) { ... }); 

세번째 용액 명시 키 확인 미들웨어 자체 (req.path === '/api/test')에 /api/test 확인하고, 일치하는 경우 단지 next()를 호출 할 수있다 :

여기서 두 용액이다.