내 사용 사례는 내 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 Error
a next()
에 전달 된 첫 번째 매개 변수 를 확인하여 일반 핸들러 또는 오류 핸들러를 호출 해야하는지 여부를 결정하기 때문입니다. instanceof JSONError
확인을 제거하고 예기치 않은 오류 (예 : 충돌)도 JSON 응답을 반환하도록 약간의 수정을 수행 할 수 있습니다.