CRUD, jsonwebtoken (2)

신동윤·2023년 2월 14일
0

게시물 등록하기

  1. 쿠키에 대한 검증을 마치고 인가를 내어준다.
  2. 로그인 정보에서 필요한 것, 등록할때 필요한 것들을 가져온다.
  3. 등록에 필요한 것들을 모아 게시물 등록한다.

게시물 전체조회

  1. Model {post}를 find()를 통해 배열의 형태로 가져온다.
  2. 전체를 보여준다.

게시물 상세조회

  1. Model {post}를 findOne()을 통해 객체의 형태로 가져온다.
  2. :postId에 해당하는 params를 받아 해당하는 게시물을 보여준다.

게시물 수정하기

  1. 쿠키에 대한 검증을 마치고 인가를 내어준다.
  2. :postId에 해당하는 params를 받아 해당하는 게시물을 찾는다.
  3. 해당하는 게시물을 찾아 수정을 진행한다.

게시물 삭제하기

  1. 쿠키에 대한 검증을 마치고 인가를 내어준다.
  2. :postId에 해당하는 params를 받아 해당하는 게시물을 찾는다.
  3. 해당하는 게시물을 찾아 삭제 진행한다.

댓글 등록하기

  1. app.js 파일에 commentsRouter를 설정한다.
  2. 우리가 생성할 모델에 따른 schema를 설정해준다. (timestameps: true 이용)
  3. Posts, Comments schema를 require해주고 인가를 위한 authMiddleware도 require해준다.
  4. postId를 처음에 넣지 않으려했는데. 초기값이 필요하여 schema에 추가하였다.
    await Comments.findOne({ postId }) 에서 필요했음
  5. 필요한 변수를 집어넣고 create

댓글 조회하기

  1. params로 받아온 postId를 통해 comment 불러오기
  2. :postId에 해당하는 params를 받아 해당하는 게시물을 보여준다.

댓글 수정하기

  1. 쿠키에 대한 검증을 마치고 인가를 내어준다.
  2. :postId, :commentId 에 해당하는 params를 받아 해당하는 게시물을 찾는다.
  3. userId를 받아와 게시물의 ID와 일치하는지 확인한다.
  4. 해당하는 게시물을 찾아 수정을 진행한다.
    (조건과 결과를 찾는 조건이 다르면 엉뚱한게 진행이 된다.)
    (authmiddleware는 로그인 사용자의 정보를 담는것이지 댓글을 쓴 ID와 검사하는 기능이 아니다.)

댓글 삭제하기

  1. 쿠키에 대한 검증을 마치고 인가를 내어준다.
  2. :postId, :commentId 에 해당하는 params를 받아 해당하는 게시물을 찾는다.
  3. userId를 받아와 게시물의 ID와 일치하는지 확인한다.
  4. 해당하는 게시물을 찾아 삭제를 진행한다.
    (조건과 결과를 찾는 조건이 다르면 엉뚱한게 진행이 된다.)
    (authmiddleware는 로그인 사용자의 정보를 담는것이지 댓글을 쓴 ID와 검사하는 기능이 아니다.)

ERROR

ValidationError: comment validation failed: commentId: Cast to Number failed for value "NaN" (type number) at path "commentId"

//post마다 commentId가 1부터 시작하게 만들고싶은거임
//post경우에는 null이였는데, 여기선 post가 존재할 때도 더해주는 거니까. NaN + 1 === NaN

  1. Posts에서 찾으려고 하려니까 ? 연산자 사용을 못하겠음. 있는 데이터인데(있어도 NaN) 있을 때 더해주세요 가 말이 안되니까.
  2. Comments에서 진행함, 그러기 위해서 schema에 postId를 하나 더 넣어줬음. 됨
    (왜 안하려 했냐면 스키마가 늘어날수록 데이터가 커질것 같아서)

!! 그때그때 다르게한다. DB를 2번 들리는방법, 저장할때 필요한 변수도 같이 넣는방법.

//생성
router.post('/posts/:postId/comments', authMiddleware, async (req, res) => {
    const { userId, nickname } = res.locals.user;
    const { postId }  = req.params;
    const { comment } = req.body;             
    const maxBycommentId = await Posts.findOne({ postId }).sort("-commentId").exec();
    const commentId = maxBycommentId ? maxBycommentId.commentId + 1 : 1;
    
    if (!comment) {
        return res.json({ errormessage: "데이터 형식이 올바르지 않습니다." });
    };
    await Comments.create({ 
        commentId, 
        postId, 
        userId, 
        nickname,
        comment 
    });
    return res.json({ "message": "댓글을 생성하였습니다." });
});
const mongoose = require("mongoose");

const commentSchema = new mongoose.Schema({
    commentId: {
        type: Number,
        required: true,
    },
    nickname: { // nickname 필드 
        type: String,
        required: true,
    },
    userId: {
        type: Number,
        required: true,
    },
    comment: {
        type: String,
        required: true
    },
},
    { timestamps: true }
);

module.exports = mongoose.model("comment", commentSchema);

0개의 댓글