2016-06-23 3 views
1

나는 익스프레스의 겉으로보기에는 좋지 않은 문서로 인해 완전히 혼란 스럽습니다. 아주 간단한 것을 보관하고 싶습니다. express에 일치하지 않는 모든 경로에 대해 맞춤 404를 반환하십시오. 첫째, 이것은 매우 정직 같다 : 유효한 URL이 개방되었을 때Express에서 404 대체 경로

app.get('/oembed', oembed()); // a valid route 
app.get('/health', health()); // another one 
app.get('*', notFound()); // catch everything else and return a 404 

그러나, (같은 /oembed) express이 경로를 통해 작업을 계속하고 notFound()뿐만 아니라를 호출 끝납니다. 여전히 내 /oembed 응답을 볼 수 있지만 본체가 이미 전송되었을 때 notFound()이 헤더 (404)를 설정하려고한다는 내용의 콘솔에 오류가 발생합니다.

나는이

function notFound() { 
    return (err, req, res, next) => { 
    console.log(err); 
    res.sendStatus(404); 
    next(err); 
    }; 
} 

같은 middleware that catches errors을 구현하기 위해 노력하고 app.use(notFound());으로 추가,하지만이 경우에도 전화를받을 수 없습니다. 나는 이것을 인터넷에서 (예를 들어 구식이 아니거나 잘못이 아님) 찾아 내기가 어렵고 공식 문서는이 표준적인 사용 사례에 특유한 것을 갖고있는 것 같지 않습니다. 나는 여기에 달라 붙어서 왜 그런지 모르겠다.

+1

'/ oembed' 경로는 어떻게 생겼습니까? –

+1

https://gist.github.com/LukasBombach/48424822c10633ac4bb5944ea6b8873b 실제 미들웨어 항목이 발생하는 코드에 주석을 달았습니다. – Lukas

답변

1

당신의 oembed의 구현 촬영 :

export default() => function oembed(req, res, next) { 
    const response = loadResponseByQuery(req.query); 

    response.onLoad() 
    .then(() => response.syncWithS3()) 
    .then(() => response.setHeaders(res)) // sets headers 
    .then(() => response.sendBody(res)) // sends body 
    .then(() => next())     // next() 

    .catch(() => response.sendError(res)) 
    .catch(() => next()); 
}; 

그것은 그것이 notFound() 핸들러를 포함한 다음 (일치) 경로 핸들러에 요청을 전달된다는 것을 의미 응답 본문을 전송 한 후 next를 부르고있다.

Express에서는 일반적으로 next은 현재 처리기가 응답하지 않거나 처리하지 못하거나 처리하고 싶을 때만 요청을 전달하는 데 사용됩니다.

+0

감사합니다. – Lukas