Express에서 오류 처리
오늘 Express 응용 프로그램에서 오류를 처리하는 데 대해 알고 있는 모든 것을 공유하고 싶습니다.
동기화 오류부터 시작합시다.
동기화 오류 처리
동기화 오류를 처리하는 경우
throw
Express Request Processor에서 오류를 처리할 수 있습니다.(주의: 요청 처리 프로그램은 컨트롤러라고도 부른다. 나는 요청 처리 프로그램을 현식이고 이해하기 쉽기 때문에 더 좋아한다.app.post("/testing", (req, res) => {
throw new Error("Something broke! 😱");
});
이러한 오류는 Express 오류 처리 프로그램을 통해 캡처할 수 있습니다.사용자 정의 오류 처리 프로그램을 작성하지 않은 경우 Express는 기본 오류 처리 프로그램을 사용하여 오류를 처리합니다.Express의 기본 오류 처리 절차는 다음과 같습니다.
비동기 오류 처리
비동기 오류를 처리하려면
next
파라미터를 통해express 오류 처리 프로그램에 오류를 보내야 합니다.app.post("/testing", async (req, res, next) => {
return next(new Error("Something broke again! 😱"));
});
Express 응용 프로그램에서 Async/await를 사용하려면 express-async-handler 라는 포장 함수를 사용해야 합니다.try/catch 블록을 사용하지 않고 비동기 코드를 작성할 수 있습니다.나는 "Using Async/await in Express"에 이 방면에 관한 내용을 더 많이 썼다.
const asyncHandler = require("express-async-handler");
app.post(
"/testing",
asyncHandler(async (req, res, next) => {
// Do something
})
);
요청 처리 프로그램을 express-async-handler
포장하면 이전처럼 throw
오류를 처리할 수 있으며, 빠른 오류 처리 프로그램이 처리할 것입니다.app.post(
"/testing",
asyncHandler(async (req, res, next) => {
throw new Error("Something broke yet again! 😱");
})
);
사용자 정의 오류 처리 프로그램 작성
Express 오류 처리 프로그램에는
error
req
res
next
app.use(/*...*/);
app.get(/*...*/);
app.post(/*...*/);
app.put(/*...*/);
app.delete(/*...*/);
// Place your error handler after all other middlewares
app.use((error, req, res, next) => {
/* ... */
});
사용자 정의 오류 처리 프로그램을 만들면 Express가 기본 오류 처리 프로그램을 사용하지 않습니다.오류를 처리하려면 요청 노드의 전단과 통신해야 합니다.이것은 당신이 필요로 하는 것을 의미한다.400 오류 요청 오류:
401 권한이 부여되지 않은 오류: 사용자가 잘못된 로그인 정보(예를 들어 사용자 이름, 이메일 또는 비밀번호)를 입력할 때 사용합니다.
403 금지된 오류: 사용자가 단점에 접근할 수 없을 때 사용합니다.
404 오류를 찾을 수 없음: 단점을 찾을 수 없을 때 사용합니다.
500 내부 서버 오류: 프런트엔드에서 보낸 요청은 정확했지만 백엔드에서 오류가 발생했습니다.
res.status
로 설정해야 합니다.app.use((error, req, res, next) => {
// Bad request error
res.status(400);
res.json(/* ... */);
});
HTTP 상태 코드가 오류 메시지와 일치해야 합니다.상태 코드를 오류 메시지와 일치시키려면 오류 메시지와 함께 보내야 합니다.가장 간단한 방법은 http-errors 패키지를 사용하는 것이다.세 가지 컨텐트를 오류로 보낼 수 있습니다.
http-errors
:npm install http-errors --save
사용http-errors
:const createError = require("http-errors");
// Creating an error
throw createError(status, message, properties);
우리가 함께 예를 하나 보고 그것을 더욱 분명하게 하자.사용자의 전자 우편 주소를 통해 사용자를 찾으려고 시도할 경우를 가정하십시오.사용자를 찾을 수 없습니다."사용자를 찾을 수 없습니다"라고 쓰여 있는 오류를 던지고 싶습니다.오류를 생성할 때 다음을 수행합니다.
app.put(
"/testing",
asyncHandler(async (req, res) => {
const { email } = req.body;
const user = await User.findOne({ email });
// Throws error if user not found
if (!user) throw createError(400, `User '${email}' not found`);
})
);
error.status
상태 코드를 가져오고 error.message
오류 메시지를 가져올 수 있습니다.// Logging the error
app.use((error, req, res, next) => {
console.log("Error status: ", error.status);
console.log("Message: ", error.message);
});
그런 다음 오류 상태를
res.status
로 설정합니다.res.json
로 메시지를 보내세요.app.use((error, req, res, next) => {
// Sets HTTP status code
res.status(error.status);
// Sends response
res.json({ message: error.message });
});
개인적으로, 나는 디버깅을 쉽게 하기 위해 상태, 메시지, 창고 추적을 보내는 것을 좋아한다.app.use((error, req, res, next) => {
// Sets HTTP status code
res.status(error.status);
// Sends response
res.json({
status: error.status,
message: error.message,
stack: error.stack
});
});
대기 상태 코드
오류가
createError
에서 발생하지 않으면 상태 속성이 없습니다.여기에 예가 하나 있다.
fs.readFile
로 파일을 읽으려고 했지만 존재하지 않습니다.const fs = require('fs')
const util = require('util')
// Converts readFile from callbacks to Async/await.
// Find out how to do this here: https://zellwk.comhttps://zellwk.com/blog/callbacks-to-promises
const readFilePromise = util.promisify(fs.readFile)
app.get('/testing', asyncHandler(async (req, res, next) => {
const data = await readFilePromise('some-file')
})
이 오류는 status
속성을 포함하지 않습니다.app.use((error, req, res, next) => {
console.log("Error status: ", error.status);
console.log("Message: ", error.message);
});
이 경우 내부 서버 오류 500개를 기본으로 설정할 수 있습니다.
app.use((error, req, res, next) => {
res.status(error.status || 500);
res.json({
status: error.status,
message: error.message,
stack: error.stack
});
});
잘못된 상태 코드 변경
사용자의 입력에서 파일을 검색하고 싶다고 가정하십시오.파일이 존재하지 않으면 서버 오류가 아니기 때문에 400 오류 요청 오류를 던져야 합니다.
이 예에서 원시 오류를 포착하려면
try/catch
를 사용하십시오.그런 다음 createError
를 사용하여 오류를 다시 생성합니다.app.get('/testing', asyncHandler(async (req, res, next) => {
try {
const { file } = req.body
const contents = await readFilePromise(path.join(__dirname, file))
} catch (error) {
throw createError(400, `File ${file} does not exist`)
}
})
404 오류 처리
요청이 모든 중간부품과 루트를 통과하면 단점을 찾을 수 없습니다.
찾을 수 없는 오류를 처리하려면 루트와 오류 처리 프로그램 사이에 중간부품을 삽입해야 합니다.여기에서
createError
를 사용하여 오류를 만듭니다.// Middlewares...
// Routes...
app.use((req, res, next) => {
next(createError(404));
});
// Error handler...
클라이언트에 보낸 후 헤더를 설정할 수 없음 정보
"서버에 전송한 후 헤더를 설정할 수 없습니다."라는 오류가 발생하면 당황하지 마십시오.
이 오류가 발생한 이유는 코드가 같은 처리 프로그램에서 응답 헤더를 설정하는 방법을 여러 번 실행했기 때문입니다.응답 제목을 설정하는 방법은 다음과 같습니다.
res.send
res.json
res.render
res.sendFile
res.sendStatus
res.end
res.redirect
res.render
와 res.json
를 실행하면'발송 후 헤더를 설정할 수 없음'오류가 발생합니다.app.get("/testing", (req, res) => {
res.render("new-page");
res.json({ message: "¯_(ツ)_/¯" });
});
따라서 이 오류가 발생하면 응답 처리 프로그램을 자세히 검사해서 상기 방법을 두 번 실행하지 않도록 하십시오.스트리밍 미디어
응답 흐름을 전방으로 전송하는 중 오류가 발생하면 같은 제목을 설정할 수 없습니다 오류가 발생합니다.
이 경우 Express 공지는 기본 Express Processor에 오류 처리를 위임해야 합니다.오류가 발생하여 연결을 닫습니다.
app.use((error, req, res, next) => {
// Do this only if you're streaming a response
if (res.headersSent) {
return next(error);
}
// Rest of the error handlers
});
나 지금 이것밖에 몰라!:)읽어주셔서 감사합니다.본문은 최초로 my blog에 발표되었다.만약 당신이 더 많은 글을 가지고 더 좋은 전단 개발자가 되는 것을 돕고 싶다면, 나의 시사 통신에 등록해 주십시오.
Reference
이 문제에 관하여(Express에서 오류 처리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/zellwk/handling-errors-in-express-5b85텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)