내 사용 사례는 내 REST API를 구동하기 위해 express를 사용하고 있기 때문에 사용자 지정 JSON 오류 메시지를 보내고 있습니다. 나는 이것이 상당히 일반적인 시나리오라고 생각하므로 내 대답에서 그것에 중점을 둘 것입니다.
짧은 버전 :
익스프레스 오류 처리
특히 서명 (err, req, res, next)을 사용하여 3 개 대신 4 개의 인수를 사용하는 것을 제외하고는 다른 미들웨어와 마찬가지로 오류 처리 미들웨어를 정의하십시오. ... 다른 app.use () 및 라우팅 호출 이후 마지막으로 오류 처리 미들웨어를 정의합니다.
app.use(function(err, req, res, next) {
if (err instanceof JSONError) {
res.status(err.status).json({
status: err.status,
message: err.message
});
} else {
next(err);
}
});
다음을 수행하여 코드의 모든 지점에서 오류를 발생시킵니다.
var JSONError = require('./JSONError');
var err = new JSONError(404, 'Uh oh! Can't find something');
next(err);
긴 버전
오류를 던지는 표준 방법은 다음과 같습니다.
var err = new Error("Uh oh! Can't find something");
err.status = 404;
next(err)
기본적으로 Express는 코드 404와 스택 추적이 추가 된 메시지 문자열로 구성된 본문이 포함 된 HTTP 응답으로 깔끔하게 패키징하여이를 처리합니다.
예를 들어 Express를 REST 서버로 사용할 때는 작동하지 않습니다. 오류가 HTML이 아닌 JSON으로 다시 전송되기를 원합니다. 또한 내 스택 추적이 내 클라이언트로 이동하는 것을 원하지 않습니다.
req.json()예를 들어 JSON을 사용하여 응답으로 보낼 수 있습니다 . 같은 것 req.json({ status: 404, message: 'Uh oh! Can't find something'}). 선택적으로을 사용하여 상태 코드를 설정할 수 있습니다 req.status(). 두 가지 결합 :
req.status(404).json({ status: 404, message: 'Uh oh! Can't find something'});
이것은 매력처럼 작동합니다. 즉, 오류가 발생할 때마다 입력하는 것이 매우 다루기 어렵고 코드는 더 이상 우리처럼 자체 문서화되지 않습니다 next(err). 정상적인 (즉, 유효한) 응답 JSON이 전송되는 방식과 너무 비슷해 보입니다. 또한 표준 접근 방식에서 발생하는 오류는 여전히 HTML 출력으로 이어집니다.
이것이 Express의 오류 처리 미들웨어가 들어오는 곳입니다. 내 경로의 일부로 다음을 정의합니다.
app.use(function(err, req, res, next) {
console.log('Someone tried to throw an error response');
});
또한 Error를 사용자 지정 JSONError 클래스로 하위 분류합니다.
JSONError = function (status, message) {
Error.prototype.constructor.call(this, status + ': ' + message);
this.status = status;
this.message = message;
};
JSONError.prototype = Object.create(Error);
JSONError.prototype.constructor = JSONError;
이제 코드에서 오류를 던지고 싶을 때 다음을 수행합니다.
var err = new JSONError(404, 'Uh oh! Can't find something');
next(err);
사용자 지정 오류 처리 미들웨어로 돌아가서 다음과 같이 수정합니다.
app.use(function(err, req, res, next) {
if (err instanceof JSONError) {
res.status(err.status).json({
status: err.status,
message: err.message
});
} else {
next(err);
}
}
오류를 JSONError로 서브 클래 싱하는 것은 중요합니다. Express가 instanceof Errora next()에 전달 된 첫 번째 매개 변수 를 확인하여 일반 핸들러 또는 오류 핸들러를 호출 해야하는지 여부를 결정하기 때문입니다. instanceof JSONError확인을 제거하고 예기치 않은 오류 (예 : 충돌)도 JSON 응답을 반환하도록 약간의 수정을 수행 할 수 있습니다.