2017-10-10 1 views
2

express.js의 문서는 next()이 경로에서 호출되지 않은 경우 다음express.js에서 next()를 생략하면 어떻게됩니까?

요청이

(https://expressjs.com/en/guide/writing-middleware.html가)

이 무엇을 의미 않는 매달려 남아있을 것이라고 언급? 이미 res.send이라고 불렀고 요청 처리가 완료 되었더라도 모든 요청을 next()으로 완료해야한다는 의미입니까? 메모리 누수 또는 생략하면 메모리 누수가 발생하지 않습니까?

업데이트 : 나는 경로와 미들웨어를 혼동하고 있습니다. 그리고 사이클이 끝날 수 있다는 것을 잊었습니다. 그러나 나는 그것을 끝내는 방법을 확신하지 못했습니다.

+0

** 미들웨어 **에서는 라우팅에 대해 묻습니다. 문서의 올바른 부분을 읽으셨습니까? 미들웨어가 무엇인지 아십니까? – Mjh

+0

문제를 더 잘 설명하는 코드 게시 –

답변

2

무엇을 의미합니까?

요청/응답주기가 아직 완료되지 않았 음을 의미합니다. 응답은 브라우저로 전송되지 않으며 브라우저는 계속 대기합니다.

이미 res.send를 호출하고 요청 처리가 완료된 경우에도 next()로 모든 요청을 완료해야한다는 의미입니까? 현재 미들웨어 기능은 요청 - 응답 사이클을 종료하지 않는 경우

전체 문장은 ...

, 는 다음 호출해야합니다() 다음의 미들웨어 기능 제어를 전달합니다. 그렇지 않으면 요청이 중단됩니다.

따라서 현재 미들웨어 내에서 순환을 종료하려면 next()없이 res.send, res.end 또는 res.json을 호출하면됩니다. 그러나 다음 미들웨어로 이동하려면 next()를 호출해야합니다. 그렇지 않으면 다음 미들웨어로 이동하지 않습니다.

생략하면 메모리 누수 또는 다른 문제가 발생하지 않습니까?

요청/응답주기가 완료되지 않은 경우 해당주기를 제공하기 위해 할당 된 메모리는 반환되지 않으므로 메모리 누수가 발생합니다.

1

메모리 누수가 발생할 것이라고 생각하지 않습니다. 다음을 호출하기 위해 next()을 사용합니다. middleware 먼저 사용자를 인증 한 다음 요청에 대한 데이터를 보내려면 다음 두 가지 작업을 수행해야합니다. 하나의 미들웨어에서 먼저 인증 한 다음 사용자가 요청을 성공적으로 인증 할 때 다음을 호출합니다.

1

next 또는 callback 함수는 본질적으로 현재 함수가 처리를 마친 이벤트 루프 이미 터에 신호를 보내는 방식입니다. 데이터를 매개 변수로 전달하여 다음 함수로 데이터를 전달할 수 있습니다.

callback 또는 next 함수를 호출하지 않으면 이벤트 루프에서 다음에 오는 함수가 절대로 실행되지 않습니다. Express는 요청 처리 후 특정 기능 체인을 가져야합니다. 콜백 함수 호출을 건너 뛰는 것은 바람직하지 않습니다. 당신이 미들웨어의 순서 선언 관련이 있기 때문에

을 (오류를 처리하는 예를 들어, 일반적인 미들웨어) 체인의 다음 미들웨어로 제어를 전달하려는 경우

1

next() 단지의 처리됩니다 표현이라고 함수의 인수를 확인합니다. 세 번째 매개 변수를 찾으면 포인터를 후속 미들웨어로 전달합니다.

결과를 클라이언트에 반환하는 경우 (예 : res.send()) 요청이 이미 끝났기 때문에 next()을 호출 할 필요가 없습니다.

//this is an example of a hanging request since you're not calling 
//niether next nor res.send() 
router.get('/myRoute', (req, res, next) => { 
    //do nothing 
}) 
1

없음 메모리 누수가, 당신은 (res.send() 후) 실행 더 이상 미들웨어가없는 경우 next()를 호출하고 싶지 않아요. next()은 cb 함수의 자리 표시 자입니다. 이것이 미들웨어이며, 요청 - 응답 사이클의 끝까지 도달 할 때까지 순차적으로 호출되는 하나 이상의 함수입니다.이 예에서 login 끝 점이되면 validatechangeStuff의 두 가지 미들웨어를 실행 한 다음 returnResponse 함수를 호출하고 요청 - 응답주기를 종료합니다.

get('/login', 
validate, 
changeStuff, 
returnResponse 
); 

function validate(req, res, next) { 
//validate logic does something then calls next() 

next() 
//just like calling changeStuff(req, res, next) 
} 

function changeStuff(req, res, next) { 
//changeStuff logic changes something then calls next() 

next() 
//just like calling returnResponse(req, res, next) 
} 

function returnResponse(req, res) { 
//will return something and that is the end of the req-res cycle 
//there are no more functions to call, if you try to call next() 
//you would get an error, because at this point next() would be 
//undefined 

res.send(req.body) 
} 
관련 문제