2015-01-08 7 views
1
Node.js를 익스프레스에서

- app.use functions-Node.js를 익스프레스 - 다음() 콜백

를 사용하는 이유는이 작업을 수행 할 필요가 없습니다 :

app.use(function(req,res,next){ 
    //do something here 
    next(req,res); 
}); 

보통 난 그냥 이렇게 작동합니까

app.use(function(req,res,next){ 
    //do something here 
    next(); 
}); 

?

답변

5

next()은 현재 실행중인 요청에 대해 reqres을 이미 알고 있으므로 직접 호출해야합니다. 이것은이 요청을 위해 만들어진 유일한 함수입니다. 또한 next()을 호출하여 체인의 다음 미들웨어를 실행하도록 현재 미들웨어 스택에있는 위치를 추적합니다.

당신이 express source code for the router 보면, 실제로 로컬로 정의 next() 기능을 볼 수 있으며 통해 발전을 위해 사용하는 것이 req, res 인덱스 카운터를 포함 폐쇄 정의 변수의 무리에 액세스 할 수있는 방법을 볼 수 있습니다 미들웨어 스택 및 다른 변수들로 구성됩니다. 따라서 다음 미들웨어 호출을 시작하는 데 필요한 모든 것을 이미 액세스 할 수 있으므로 이러한 것을 전달할 이유가 없습니다.

참고로 오픈 소스 사용에 대한 훌륭한 점 중 하나는 코드를 직접보고 자신이하는 일을 볼 수 있다는 것입니다.

  1. 당신은 next()로 호출 할 수 있으며, 이것은 단지 스택의 다음 미들웨어 핸들러를 호출합니다 :

    next()를 호출

    , 당신은 몇 가지 선택이있다.

  2. next('route')으로 호출 할 수 있으며 다음 경로 처리기로 건너 뜁니다.

  3. next(err) 오류를 전달하고 오류 처리기를 제외한 모든 추가 미들웨어 또는 라우터 처리를 중지 할 수 있습니다.

여기에 자세한 내용이 설명되어 있습니다. http://expressjs.com/guide/error-handling.html.

여기에 해당 페이지에서 메모입니다 :

next()next(err)Promise.resolve()Promise.reject() 유사합니다. 이 현재 처리기가 완료되었으며 어떤 상태인지 Express에 알릴 수 있습니다. next(err)은 다음 섹션에서 설명하는대로 오류를 처리하도록 설정된 것을 제외하고는 체인에서 나머지 핸드 012어 모두 을 건너 뜁니다.

+1

이는 '다음'에 '오류'가 전달되었다는 언급이 없으므로 부분적으로 정확합니다. 이렇게하면 최종 오류 처리기를 직접 호출하여 스택의 모든 미들웨어 조각을 무시할 수 있습니다. – ded

+0

@ded - 나는 그것을 나의 대답에 추가하려고 노력할 것이다. 그러나 당신은 질문의 일부가 아니었고 심지어 OP가 묻기를 의도하지 않은 무언가를 남겨 뒀다는 것을 나에게 줄 섰다. 진심으로? – jfriend00

+0

나는 downvote를 취소 할 것이다 :) 나는 당신의 답을 탈선시키지 않을 것이고, 우호적 인 것을 유지하기를 원한다. 내 가정은 원래 질문에'next (req, res);를 전달하는 코드 블록이 포함되어 있다는 것입니다.'next '로 전달하기에 적절한 것을 포함하면 아마도 좋은 대답이 될 것입니다. – ded

1

next을 사용하면 선택적인 Error 개체를 사용할 수 있습니다. 아무 것도 전달하지 않으면 다음 미들웨어 또는 실제 탑재 된 처리기를 계속 사용할 준비가되어 있다고 가정합니다.그렇지 않으면, Error 개체의 인스턴스를 전달하면 탑재 된 처리기 (및 순차적 미들웨어)를 무시하고 직접 오류 처리기로 이동합니다.

app.use(function (req, res, next) { 
    if (!req.user || !req.user.isAuthorized) next(Error('not allowed')) 
    else next() 
}) 

app.get('/:user', function (req, res, next) { 
    res.render('users/index', { user: req.user }) 
}) 

app.use(function (err, req, res, next) { 
    console.log(err.message) // not allowed 
    res.render('500', err) 
}) 
관련 문제