TIL
Issues encountered
- nested try-catch refactoring
- nested router 처리하기: https://stackoverflow.com/questions/25260818/rest-with-express-js-nested-router
What I tried
- 처음에는 mongoDB의 데이터들을 지우고 업데이트할 수 있는 deleteOne()과 updateOne() functions를 try-catch문 안에 넣어서 해당 함수 처리가 실패하였을 때 catch{}로 넘어가는 식으로 만들어서 nested try-catch문을 사용하게 되었었다.
=> 그러나, 위 두 함수는 Promise 형태이기 때문에 뒤에 .catch()
를 통해 에러를 바로 잡을 수 있다.
try {
const existingPost = await Posts.findOne({ userId, _id: _postId }).exec();
if (!existingPost)
return res.status(403).json({ errorMessage: "게시글 수정의 권한이 존재하지 않습니다.",});
try {
await Posts.updateOne({ userId, _id: _postId }, { $set: { title, content } });
res.status(200).json({ message: "게시글을 수정하였습니다." });
} catch (error) {
console.error(error);
return res.status(401).json({
errorMessage: "게시글이 정상적으로 수정되지 않았습니다.",});
}
} catch (error) {
console.error(error);
res.status(400).json({ errorMessage: "게시글 수정에 실패하였습니다." });
}
const router = express.Router({ mergeParams: true });
이를 각 하위 라우터 파일들에 넣어주면 index.js에서 경로 처리를 할 수 있다.
const express = require("express");
const router = express.Router();
const postsRouter = require("./posts.js");
const usersRouter = require("./users.js");
const commentsRouter = require("./comments.js");
router.use("/users", [usersRouter]);
router.use("/posts", [postsRouter]);
router.use("/posts/:_postId/comments", [commentsRouter]);
module.exports = router;
How I resolved the issues
try {
const existingPost = await Posts.findOne({userId, _id: _postId,}).exec();
if (!existingPost)
return res.status(403).json({
errorMessage: "게시글 수정의 권한이 존재하지 않습니다.",});
await Posts.updateOne(
{ userId, _id: _postId },
{ $set: { title, content } }
).catch((error) => {
console.error(error);
res.status(401).json({
errorMessage: "게시글이 정상적으로 수정되지 않았습니다.",
});
});
res.status(200).json({ message: "게시글을 수정하였습니다." });
} catch (error) {
console.error(error);
res.status(400).json({ errorMessage: "게시글 수정에 실패하였습니다." });
}
What I newly learned
- bcrypt: to make 패스워드 more secure by converting the user input 패스워드 into the hashed 패스워드
- how to deal with the nested router
- Swagger!
What to learn next
- Change MongoDB to MySQL
- Learn Sequelize