1. 잘못된 요청 에 대해, 404 코드 보내기
만약 클라이언트로부터 잘못된 요청이 온다면, 어떻게 처리해야 할까?
적절한 에러코드를 보냄으로써, 요청에 대한 응답을 처리하자.
< router / diary.js >
const express = require("express");
const router = express.Router();
router.get("/:userEmail", (req, res, next) => {
const userEmail = req.params.userEmail;
if (!userEmail.includes("@")) {
res.status(404).json({ message: "not found" }); // return이나, if,else 등을 사용하여
return; // 코드의 중지는 필수다.
}
res.status(200).json({ message: "this is diary" });
});
module.exports = router;
** if 등을 사용할때 return, thorw, if else 등으로 "코드를 중지"하지 않으면
if (){
res.json...
}
res.json...
일때, res 가 두번 가므로, 오류가 발생하거나, 원하는 형태의 값이 나오지 않을 수 있음에 주의하자.
2. 특수 처리 미들웨어를 사용하여, 에러 처리하기
인수가 4개 (error, req, res, next) 인 미들웨어는 특수하게 사용된다.
바로 error 가 발생했을 때 만 처리되는 미들웨어로서 동작 할 수 있다.
< index.js >
const express = require("express");
const cors = require("cors");
const bodyparser = require("body-parser");
const diaryRouter = require("./routes/diaryt-routes");
const app = express();
app.use(cors());
app.use("/api/diary", diaryRouter);
app.use((error, req, res, next)=>{
if(res.headerSent){ // 이미 res를 보냈는지 확인하는 작업
return next(error) // 이미 res를 보냈다면, 그냥 넘기고(next), 코드를 종료(return)
}
res.status(error.code || 500) // 에러코드가 넘어왔다면 사용 아니면 500
res.json({message: error.message || "something got wrong"}) // 에러메시지가 왔다면 사용, 아니면 따로정의
})
app.listen(5000);
그렇다면, error 가 발생했음을 어떻게 알까?
이 특수처리 미들웨어 이전에 error 를 발생시키고, 이 미들웨어로 error 를 넘기면 된다.
에러를 넘기는 방법은 두가지이다.
1) throw new Error
2) next(error)
thorw new Error 는 "동기적 코드에 적합하다." 실행되자마자 에러를 발생시키고 코드를 중지한다.
하지만 REST API 의 특성상 "비동기 함수" 를 주로 사용할것이다.
이는 함수의 결과값이 언제 들어올지 모르고, 그때까지 기다릴 필요가 있다.
따라서, "비동기 함수" 일 경우 "next" 를 통해, 값이 나오면 에러를 넘기는 것이 좋은 방법이겠다.
물론 "동기적 코드에도 그냥 next 를 사용하여 에러를 넘기도록하자."
Diary-Route 에서 에러를 넘겨보자.
< router / diary.js >
...
router.get("/:userEmail", (req, res, next) => {
const userEmail = req.params.userEmail;
if (!userEmail.includes("@")) { // 자체 Validation 을 사용하여 만족하지 않으면 error를 발생시키자.
const error = new Error("이메일이 올바르지 않습니다.") // 에러 생성자함수로, 에러 객체를 생성
error.code = 404 // 해당 에러객체에, 코드를 추가해주고
next(error) // 넘긴다.
return // return 으로 중지하는 것을 잊지 말자.
}
res.json({ message: "this is diary" });
});
module.exports = router;
** new Error 로 만든 에러 객체의 기본 키 는 message 이다.
즉, 생성하면 error.message = "이메일이 올바르지 않습니다."
가생성되는것이다
이렇게 next 로 error 값을 넘기게 되면, 해당 error 는 특수처리 미들웨어를 동작하게 만들고
특수 처리 미들웨어는 적절한 값을 response 하게 된다.
3. 잘못된 경로로 온 요청 처리하기
누군가 서버로 요청을 보냈는데, 경로를 잘못 적어 보낼 수 있다.
DOMAIN/api/diary 로 보내야하는 요청을
DOMAIN/diary 로 보낸는 실수 같은 것들이 그렇다.
DOMAIN/api/diaryss 로 보낸다던가
이런 것들을 처리하기 위해, 앞서 모든 요청에 대해 맞는 경로가 없어,
마지막에 그냥 모든 요청에 대해 응답하는 미들웨어를 만들어서 처리한다.
< index.js >
app.use((req, res, next) => { // 모든 라우터를 거쳐, 맞는 라우터가 없을때 최종적으로 담길 미들웨어
const error = new Error("wrong url");
error.code = 404;
throw error;
});
app.use((error, req, res, next) => { // 오류처리 미들웨어
if (res.headerSent) {
return next(error);
}
res.status(error.code || 500);
res.json({ message: error.message || "something got wrong" });
});
=> 이는, 앞서 만든 오류처리 미들웨어(error 가 발생하면 실행되는)에 의해
최종적으로 에러메시지와 코드가 표시될것이다.
'Node.js(Express)' 카테고리의 다른 글
6. Validation 아웃소싱 (0) | 2023.02.18 |
---|---|
5. MVC 패턴, Contoroller 의 사용 // 여러개의 미들웨어 (0) | 2023.02.18 |
3. 라우터를 사용하여, 미들웨어를 설정하기 (0) | 2023.02.18 |
2. 기본 서버 환경 구성하기 (0) | 2023.02.18 |
1.Node.js 의 기본 (0) | 2023.02.18 |
댓글