Node.js lv2 과제
post요청 에러 핸들링
수정전
- 데이터형식이 이상할 경우 조건문에 맞는 에러를 반환하기 위한 코드를 작성하였으나 모든 조건문에 걸리지 않고 바로 catch문에 있는 400에러를 반환하는 상황이었다.
- 문제 파악: title이나 content의 key나 데이터가 제대로 입력되지않았을때 오류를 반환했어야 한다. 이떄 변수 createdPosts 에서 실행한 create에서 title이나 content의 값이 undefined로 정의가 되는 경우를 확인했다. 그래서 오류가 발생했고 try문에서 발생한 오류는 바로 catch로 넘어 갔기 때문에 아래 조건문에 걸리지 않고 넘어 갔던 거였다.
try {
//몽고db에 생성할 스키마
const createdPosts = await Posts.create({ userId, nickname, title, content, createdAt })
const isExisttitle = Object.keys(req.body).includes('title')
const isExistcontent = Object.keys(req.body).includes('content')
//412 body 데이터가 정상적으로 전달되지 않는 경우
if (!title || !content) {
console.log(1)
res.status(412).json({ "errorMessage": "데이터 형식이 올바르지 않습니다." })
return
}
if (typeof title !== 'string' || typeof content !== 'string') {
console.log(1)
res.status(412).json({ "errorMessage": "데이터 형식이 올바르지 않습니다." })
return
}
//# 412 Title의 형식이 비정상적인 경우
if (!isExisttitle) {
console.log(2)
res.status(412).json({ "errorMessage": "게시글 제목의 형식이 일치하지 않습니다." })
return
}
// # 412 Content의 형식이 비정상적인 경우
if (!isExistcontent) {
console.log(3)
res.status(412).json({ "errorMessage": "게시글 내용의 형식이 일치하지 않습니다." })
return
}
return res.status(201).json({ "message": "게시글 작성에 성공하였습니다." })
} catch (error) {
// 400 예외 케이스에서 처리하지 못한 에러
console.log(4)
res.status(400).json({ "errorMessage": "게시글 작성에 실패하였습니다." })
}
수정후
- 변수 createdPosts를 return 201바로 위로 옮겨 title이나 content의 값이 제대로 들어오지 않았을때 조건문에 먼저 걸려 에러를 반환하도록 수정하였다. 위 조건문들을 모두 통과하고 에러가 나지 않았을때 create함수를 실행하여 db에 데이터를 저장하게 되는식으로 수정하였고, 조건문을 조금더 가독성있게 압축하여 수정하였다.
try {
//412 body 데이터가 정상적으로 전달되지 않는 경우
if (Object.keys(req.body).length === 0) {
res.status(412).json({ "errorMessage": "데이터 형식이 올바르지 않습니다." })
return
}
//# 412 Title의 형식이 비정상적인 경우
if (!title) {
res.status(412).json({ "errorMessage": "게시글 제목의 형식이 일치하지 않습니다." })
return
}
// # 412 Content의 형식이 비정상적인 경우
if (!content) {
res.status(412).json({ "errorMessage": "게시글 내용의 형식이 일치하지 않습니다." })
return
}
const createdPosts = await Posts.create({ userId, nickname, title, content, createdAt })
return res.status(201).json({ "message": "게시글 작성에 성공하였습니다." })
} catch (error) {
// 400 예외 케이스에서 처리하지 못한 에러
res.status(400).json({ "errorMessage": "게시글 작성에 실패하였습니다." })
}
미들웨어 에러처리
- jwt의 쿠키가 유효한지 유효한지 않은지 판단하는 조건문과 로그인 하지 않았을때 에러처리를 작성하였다.
authType이나 authToken의 값 둘중 하나라도 유효하지 않을때 에러를 반환하고 그렇지 않을때는 User스키마에서 userId와 일치하는 토큰값을 찾아 로컬에 할당하는 식을 작성하였다.
try {
//# 403 Cookie가 존재하지 않을 경우
if (authType !== "Bearer" || !authToken) {
return res.status(403).json({ errorMessage: "전달된 쿠키에서 오류가 발생하였습니다." });
}
const { userId } = jwt.verify(authToken, "customized secret key")
const user = await User.findById(userId)
res.locals.user = user;
next();
} catch (err) {
//403 Cookie가 비정상적이거나 만료된 경우
console.error(err);
res.status(403).json({ "errorMessage": "로그인이 필요한 기능입니다." });
return;
}
내일할일: lv3 강의 듣고 lv3어느정도 작성하기, aws배포 다시한번 듣고 aws 흐름이해하기