/ login을 제외한 모든 경로를 잡아라


85

저는 현재 사용자가 각 요청의 헤더에 인증 토큰을 전달해야하는 API를 작성 중입니다. 이제 포괄 경로를 만들 수 있다는 것을 알고 있습니다.

app.get('/*', function(req,res){

});

하지만 /login또는 같은 특정 경로를 제외하도록 어떻게 만들지 궁금합니다 /.


1
예 : / login/ register를 제외한 모든 경로에서 인증이 필요합니다 . (사람들이 왜이 질문을했는지 궁금해하기 때문에)
a20

답변:


128

사용자가 /login또는 /에 액세스 할 때 어떤 일이 발생하고 싶은지 잘 모르겠지만 별도의 경로를 만들 수 있습니다. catch-all 전에 선언하면 들어오는 요청을 처리 할 때 첫 번째 딥이 발생합니다.

app.get('/login', function(req, res) {
  ...
});

app.get('/', function(req, res) {
  ...
});

app.get('*', function(req, res) {
  ...
});

1
이것은 "GET"의 경우에만 작동합니다. 어떤 이유로 나는 app.use(다른 방법을 포함 하기 위해)이 답변을 사용할 수 없습니다 .
SSH이

4
@SSH 이것은 최신 버전의 Express (v4)에서도 app.use('*', ...)작동 할 것이라고 생각합니다 . 그러나이 경우 사용하는 app.all('*', ...)것이 바람직합니다.
robertklep

@JulienMartin이 방금 테스트했으며 Express v4.16.3에서 예상대로 작동하는 것 같습니다.
robertklep

app.use미들웨어를 추가합니다. 설계 상 대부분 요청을 체인의 다음 핸들러로 전달합니다 (추가 인수 사용 next).
Stijn de Witt

45

제외하려는 경로 뒤에 항상 포괄 경로를 배치 할 수 있습니다 ( robertklep 답변 참조 ).

그러나 때로는 경로의 순서에 관심이 없을 때가 있습니다. 이 경우에도 원하는 작업을 수행 할 수 있습니다.

app.get('*', function(req, res, next) {
  if (req.url === '/' || req.url === '/login') return next();
  ...
});

1
.get ( '*', function (req, res, next).
Oliver Dixon

2
@iLoveUnicorns 고맙습니다! 왜 내 게시물을 편집하지 않았습니까?
Leonid Beschastny

다른 규칙이 그 이전 인 경우 다음으로 전화해야합니까?
Sandburg

1
@Sandburg 미들웨어는 next()다음 미들웨어로 실행을 전달하기 위해 호출 하거나 요청 처리를 완료하기 위해 일부 응답을 보내야합니다. 그렇지 않으면 요청이 중단됩니다. 스택의 마지막 미들웨어가 호출 next()되면 express는 기본 "404 찾을 수 없음"응답을 보냅니다. next()예를 들어 전화하는 대신 res.status(400).end()"400 Bad Request"응답으로 요청 처리를 완료하기 위해 전화를 걸 수 있습니다.
Leonid Beschastny

24

모든 요청에서 자격 증명 또는 신뢰성을 확인하려면 Express Routing 기능 "all"을 사용해야합니다. 다음과 같이 사용할 수 있습니다.

app.all('/api/*', function(req, res, next){
    console.log('General Validations');
    next();
});

라우팅 항목 앞에 배치 할 수 있습니다.

이 경우 "/ api / "를 경로로 사용 했으므로 "/ 했으므로 필요에 맞게 "를 .

여기 누군가를 돕는 것이 너무 늦지 않았기를 바랍니다.


10

포괄적 인 경로 처리기를 만드는 또 다른 방법은 다음과 같습니다.

app.get('/login', function(req, res) {
  //... login page
});
app.get('/', function(req, res) {
  //...index page
});
app.get('/:pageCalled', function(req, res) {
  console.log('retrieving page: ' + req.params.pageCalled);
  //... mypage.html
});

이것은 robertklep의 (허용되는) 답변과 똑같이 작동하지만 사용자가 실제로 요청한 것에 대한 자세한 정보를 제공합니다. 이제 req.params.pageCalled요청되는 페이지를 나타내는 슬러그 가 있으며 여러 페이지가있는 경우 사용자를 적절한 페이지로 안내 할 수 있습니다.

하나 gotchya는,이 방법 (들으 @agmin)에 대한 조심하는 /:pageCalled단 하나와 경로를 잡을 것입니다 /당신이 얻을되지 않도록, /route/1같은 등을 사용하여 추가 슬러그 /:pageCalled/:subPageCalled더 페이지 (들으 @softcode)


보다 나은? 정말? 상황에 따라 정의가 결정되지 않습니까? ;-) 관련 없음 : 댓글을 남기지 않고 반대 투표하는 사람들 : 얼마나 무례합니다!
Potherca 2015 년

15
이 접근 방식에는 거대한 gotchya가 /:pageCalled있습니다. 단일으로 만 경로를 잡을 /것이므로 /route/1등을 얻지 못할 것입니다 .
agmin

또한 try / catch로 묶지 않으면 해당 페이지가 없으면 오류가 발생합니다.
darethas

@agmin 그래서 해결책은 단순히 /:pageCalled/:subPageCalled등을 추가하는 것이 아닐까요?
소프트 코드
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.