본문 바로가기

TIL

내일배움캠프 4기_Node입문 개인과제 24일차 TIL

728x90

내일배움캠프 4기_Node입문 개인과제 24일차 TIL


 

개인과제

  1. 전체 게시글 목록 조회 API
    • 제목, 작성자명, 작성 날짜를 조회하기
    • 작성 날짜 기준으로 내림차순 정렬하기
  2. 게시글 작성 API
    • 제목, 작성자명, 비밀번호, 작성 내용을 입력하기
  3. 게시글 조회 API
    • 제목, 작성자명, 작성 날짜, 작성 내용을 조회하기 (검색 기능이 아닙니다. 간단한 게시글 조회만 구현해주세요.)
  4. 게시글 수정 API
    • API를 호출할 때 입력된 비밀번호를 비교하여 동일할 때만 글이 수정되게 하기
  5. 게시글 삭제 API
    • API를 호출할 때 입력된 비밀번호를 비교하여 동일할 때만 글이 삭제되게 하기
  6. 댓글 목록 조회
    • 조회하는 게시글에 작성된 모든 댓글을 목록 형식으로 볼 수 있도록 하기
    • 작성 날짜 기준으로 내림차순 정렬하기
  7. 댓글 작성
    • 댓글 내용을 비워둔 채 댓글 작성 API를 호출하면 "댓글 내용을 입력해주세요" 라는 메세지를 return하기
    • 댓글 내용을 입력하고 댓글 작성 API를 호출한 경우 작성한 댓글을 추가하기
  8. 댓글 수정
    • 댓글 내용을 비워둔 채 댓글 수정 API를 호출하면 "댓글 내용을 입력해주세요" 라는 메세지를 return하기
    • 댓글 내용을 입력하고 댓글 수정 API를 호출한 경우 작성한 댓글을 수정하기
  9. 댓글 삭제
    • 원하는 댓글을 삭제하기

 


mongoose Schema option

{timestamps: true}

mongoose schema option

 

 

처음에 스키마 옵션이 있는지 모르고

> dt = new Date()
Thu Dec 15 2022 19:52:35 GMT+0900 (한국 표준시)

> dt.toISOString();
'2022-12-15T10:52:35.678Z'

현재 날짜를 생성해서 db create할 때 넣어줘야 하는 줄 알았다.

다른 분이 제출한 코드를 바탕으로 공부하니, 스키마 옵션이 있었다!!

 

/schemas/post.js

const mongoose = require("mongoose");

const postSchema = new mongoose.Schema({
    user: {
      type: String,
      required: true
    },
    password: {
      type: String,
      required: true
      },
    title: {
      type: String,
      required: true
    },
    content: {
      type: String,
      required: true
    },
  }, {timestamps: true});

  module.exports = mongoose.model("Post", postSchema);

입문주차 과제 API

과제 api_1
과제_api_2

 

과제api_3

멘붕...ㅎㅎㅎㅎㅎ

게시물 생성까지는 어렵지 않게 구현했지만, 예외처리, 오류 발생처리가 어려웠다.

 

다른분이 한거 보고 try-catch를 활용해 예외처리 한다는 점을 알게되었다!

 

/routes/posts.js

// 게시글 작성
router.post("/posts", async(req, res) => {
  try{
    const { user, password, title, content } = req.body;

    await Post.create({user, password, title, content});

    res.status(200).json({
      message: "게시글을 생성하였습니다.",
    });
  } catch(err){
    res.status(400).json({
      message: "데이터 형식이 올바르지 않습니다."
    });
  }

});

// 게시글 조회
router.get('/posts', async(req, res) => {

  const posts = await Post.find({}).sort({createdAt:-1});

  const results = posts.map((post) => {
    return {
      "postId": post._id,
      "user": post.user,
      "title": post.title,
      "createdAt": post.createdAt
    }
  })
  
  res.status(200).json({
    "data": results
  })
});

댓글 수정

 

너무 막막.. 접근방법 생각하느라 골먹었다.

나는 그냥 uri를 통해 들어온 postid가 post테이블에 없으면 댓글을 작성할 수 없게 했다.

{ _postId:postId }

// { "postId" : _postID } KEY-VALUE 형태

postid를 comment테이블에 참조키마냥 넣었다.

const Post = require("../schemas/post.js");
const Comment = require("../schemas/comment.js");

// 댓글 생성
router.post('/comments/:_postId', async(req,res) => {
  try{
    const { _postId:postId } = req.params;
    const { user, password, content } = req.body;
  
    if(content === undefined){
      return res.status(400).json({
        message: "댓글 내용을 입력해 주세요."
      })
    }
  
    const existsPost = await Post.find({_id:postId});
    if(existsPost.length){
      await Comment.create({ postId, user, password, content});
    }
  
    res.status(200).json({
      message: "댓글을 생성하였습니다.",
    });

  } catch (err){
    res.status(400).json({ 
      message: "데이터 형식이 올바르지 않습니다."
    });
  }

});

댓글 수정&삭제 예외처리는 너무 어렵다...

좀더 고민해봐야 겠다.