Photo by Byron Johnson on Unsplash
게시글 쓰기, 수정, 삭제, 가져오기(읽기) 기능 만들기
라우터를 생성하고 포스트스키마 가져오기
const router = require("express").Router();
const Post = require("./models/Post");
라우터 작성 (새 데이터 업로드 -> post메서드)
router.post("/", async (req, res) => {
const newPost = new Post(req.body);
try {
const savedPost = await newPost.save();
res.status(200).json(savedPost);
} catch(err)
res.status(500).json(err);
}
});
const newPost = await new Post(req.body);
스키마모델 형태로 바디에 담긴 데이터를 newPost라는 변수로 선언
const savedPost = newPost.save();
MongoDB에 이 데이터(게시물) 등록
index.js 에서 작성한 라우터 가져오고 실행
const postRouter = require("./routes/posts");
//...
app.use("/api/post", postRouter);
npm test로 노드몬 실행
서버를 열면 MongoDB에 blog/posts
자동으로 생성
포스트 스키마의 required:true
설정한 필드값과 스키마에 없던 필드값도 포함해서 요청테스트
스키마에 있는 필드값만 DB에 저장됨.
unique:true
를 가지고 있는title
필드가 중복되었을때 응답객체게시물 작성자인지 판단
true -> 수정코드 실행
false -> 메시지 혹은 미리 프론트에서 처리(수정버튼 없애기 or 게시물 비밀번호입력..등등)
router.put('/:id', async (req, res) => {
try {
const post = await Post.findById(req.params.id);
if(post.username === req.body.username) {
try {
const updatedPost = Post.findByIdAndUpdate(req.params.id, {
$set: req.body
}, { new: true });
res.status(200).json(updatedPost);
} catch(err) {
res.status(500).json(err);
}
} else {
res.status(401).json("글 작성자만 수정 할 수 있어요")
}
} catch(err) {
res.status(500).json(err);
}
});
게시물 작성자 판단
1-1. const post = await Post.findById(req.params.id);
:id 파라미터의 id값으로 DB의 Post에서 게시물 검색
console.log(post);
{ _id: new ObjectId("62493df3dde99de1c20d3825"), title: '첫번째 게시물 올리기 테스트', desc: '포스트맨으로 보내는 게시물입니다. 잘 보이시나요?', username: '패스워드맨', categories: [ '테스트', '카테고리' ], createdAt: 2022-04-03T06:25:55.595Z, updatedAt: 2022-04-03T06:25:55.595Z, __v: 0 }
1-2. if(post.username === req.body.username)
검색된 게시물의 작성자(username)이 수정할 포스트작성자(req.body.username)과 일치하는지 확인
const updatedPost = awiat Post.findByIdAndUpdate(req.params.id, {
$set: req.body
}, { new: true });
res.status(200).json(updatedPost);
POSTMAN 테스트
3-1. 내용을 수정할 게시물
3-2. parameter에 id값 입력, 수정할 내용 body에 담아 요청
게시물 수정과 동일
1. 작성자 본인확인
2. 포스트 삭제
router.delete("/:id", async (req, res) => {
try {
const post = await Post.findById(req.params.id);
if(post.username === req.body.username) {
try {
// await Post.findByIdAndDelete(req.params.id);
await post.delete();
res.status(200).json("게시물이 정상적으로 삭제되었습니다.");
} catch (err) {
res.status(500).json(err);
}
} else {
res.status(401).json("글 작성자만 삭제할 수 있어요.");
}
} catch (err) {
res.status(500).json(err);
}
})
await Post.findByIdAndDelete(req.params.id);
로도 삭제 할 수 있지만,
본인확인 과정에서 선언한 post
가 DB를 참조하고 있으니 await post.delete();
로 지울 수 있다.
실패시 응답
성공시 응답
params id로 Post 값만 읽어오면 됨
router.get("/:id", async (req, res) => {
try {
const post = await Post.findById(req.params.id);
res.status(200).json(post);
} catch(err) {
res.status(500).json(err);
}
})
Request.query
를 사용하여 조건별로(이름,카테고리,날짜...etc) 혹은 모든 값을 가져오기
router.get("/", async (req, res) => {
const username = req.query.user;
const catName = req.query.cat;
try {
let posts;
if(username) {
posts = await Post.find({username:username})
} else if(catName) {
posts = await Post.find({categories: {
$in:[catName]
}})
} else {
posts = await Post.find();
}
res.status(200).json(posts);
} catch (err) {
res.status(500).json(err);
}
})
Request.query
Retrieve the GET query string parameters using Express - flaviocopes.com
파라미터에 추가될 값이 username:"철수"
인 경우
const username = req.query.user
이렇게 선언하면
----> router.get("/?user=철수"), async ...
이런식으로 쿼리로 바꿔준다.
let posts
포스트 배열이 들어갈 변수를 미리 선언
if(username) { posts = await Post.find({username:username}) }
{ username: username }
은 { username }
으로 단축할 수 있다.
Post에서 username(DB의 username필드)
가 username(req.query.user)
인 문서 모두 찾기
Post의 데이터중에 categories 필드에 [catName] 배열안의 값을 포함한 게시물을 모두 찾기
posts = await Post.find({categories: {
$in.[catName]
}});
post = await Post.find();
인수없이 find()를 사용하는 경우 ---> Post DB 전체를 모두 가져옴
응답 테스트
MongoDB내 데이터
?user=패스워드맨
?user=사과맨
?cat=과일
아무것도 입력안했을때/
(모두찾기)