블로그용 API 만들기 -3

mh·2022년 4월 3일
0

nodeJS

목록 보기
3/5
post-thumbnail

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라는 변수로 선언

  • 통신은 항상... async ... await....

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-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)과 일치하는지 확인

  1. DB 업데이트 후 응답 출력
const updatedPost = awiat Post.findByIdAndUpdate(req.params.id, {
	$set: req.body
}, { new: true });
res.status(200).json(updatedPost);
  1. POSTMAN 테스트

    3-1. 내용을 수정할 게시물

    3-2. parameter에 id값 입력, 수정할 내용 body에 담아 요청

    • 성공시 ( 작성자가 동일할때 )
    • 실패시 ( 작성자가 다를때 )
    • params 가 잘못된 경우 (DB에 없는 데이터 검색 -> null 반환)

게시물 삭제

게시물 수정과 동일
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);
    }
})
  1. Request.query
    Retrieve the GET query string parameters using Express - flaviocopes.com
    파라미터에 추가될 값이 username:"철수"인 경우
    const username = req.query.user 이렇게 선언하면
    ----> router.get("/?user=철수"), async ...
    이런식으로 쿼리로 바꿔준다.

  2. let posts
    포스트 배열이 들어갈 변수를 미리 선언

  3. if(username) { posts = await Post.find({username:username}) }
    { username: username }{ username }으로 단축할 수 있다.
    Post에서 username(DB의 username필드)username(req.query.user)인 문서 모두 찾기

  4. Post의 데이터중에 categories 필드에 [catName] 배열안의 값을 포함한 게시물을 모두 찾기

posts = await Post.find({categories: {
	$in.[catName] 
    }});
  1. post = await Post.find(); 인수없이 find()를 사용하는 경우 ---> Post DB 전체를 모두 가져옴

  2. 응답 테스트
    MongoDB내 데이터

  • ?user=패스워드맨

  • ?user=사과맨

  • ?cat=과일

  • 아무것도 입력안했을때/ (모두찾기)

profile
🤪🤪🤪🤪🤪

0개의 댓글