2013-03-22 3 views
13

나는 이것과 같은 미들웨어를 가지고 있다고 가정한다;Express/Connect 미들웨어의 요청을 "끝내는"올바른 방법은 무엇입니까?

var express = require('express'); 
var app = express(); 

app.use(function (req, res, next) { 
    var host = "example.com"; 

    if (req.host !== host) { 
     res.redirect(301, host + req.originalUrl); 
     res.end(); 
    } 
}); 

여기에 어떤 규칙을 준수해야합니까?

  1. res.end()으로 전화해야합니까? (또는 res.redirect()은 나를 위해이 작업을 수행합니까?)
  2. next()으로 전화해야합니까? (또는 깨끗하게 종료 요청하고 종료를 감지 연결합니까?)
  3. 내가next() 호출해야 가정하면, 그 의미 추측 I 수 이미 다른 의해 종료되었을 수 있습니다 내 미들웨어에 잠재적으로 수신 할 수 요청 사슬에서 더 높은 미들웨어; 내가 어떻게 자신을 보호해야합니까?

답변

18
  1. res.redirect()은 참으로 res.end() 자체 호출;
  2. 미들웨어가 끝점이 아닌 경우 next()으로 전화해야합니다. 리디렉션을 생성하는 경우 이고 끝점은 next()이 아니며 req.host === host 인 경우 요청을 다른 미들웨어/경로로 이동하려면 next()으로 전화해야합니다.
  3. 요청이 끝나지 않으면 응답이 수행됩니다. 그렇게하면 미들웨어 체인이 종료되므로 걱정할 필요가 없습니다.
+1

당신이 할 수있는 다른 처리 방법이 있다면 다음에 응답 할 수 있다는 점에 유의해야합니다. 그러나 응답 개체가 완료되었으므로 응답 개체가 끝났으며 응답 후 처리를위한 변수가 상당합니다. 응답을 보내려는 경우 다른 서버와 통신하여 통계를 추적하거나 전자 메일을 보내거나 대기열에 넣거나 데이터베이스 등에 연결하는 등 더 느린 작업을 수행 할 때 유용합니다. 요청/응답 체인은 더 ​​이상 미들웨어를 호출하지 않고 가비지 수집을하는 경우입니다. –

관련 문제