TIL 23-06-14

level·2023년 6월 14일

TIL

목록 보기
27/95
findById(_id)

몽고db 검색 메서드 중 하나다
mongoose 공식문서
https://mongoosejs.com/docs/api/model.html#model_Model.findById
참고블로그
https://choice91.tistory.com/33
_id를 기준으로 단일 문서를 찾는다.
_id를 기준으로 질의하려면 findOne()대신에 findById()를 사용하라고 한다.


게시글조회, 상세조회

과제 api 문서를 보면 게시글을 조회하면 응답에는 비밀번호와 content가 없다. 아무 장치 없이 post:post 로 받아올 경우 req한 모든 정보가 내려받아졌다. 그리고 db에 저장할 시 자동으로 생성되는 "_ v" 항목도 함께 내려받아졌다. 이와 같은 문제를 해결하기 위해 .select()메서드를 활용해서 게시글 조회 api에서는 비밀번호와 content, _v를 제외해주었고, 상세조회에서는 비밀번호와 _v를 제외해주었다.

.select("-password -content -__v")
.select("-password -__v");

mongoose 공식문서
https://mongoosejs.com/docs/api/query.html#Query.prototype.select()
.select() 메서드는 Mongoose에서 쿼리 결과에서 특정 필드를 선택하거나 제외할 때 사용(쿼리에 적용되어 반환되는 문서의 필드를 제어)

사용법

  1. 원하는 필드 선택:

    • 문서에서 반환할 필드를 .select("field1 field2")와 같이 사용하여 "field1"과 "field2" 필드를 선택
  2. 필드 제외:

    • 문서에서 반환할때 제외하려는 필드를 - 기호를 사용하여.select("-field1 -field2")와 같이 "field1"과 "field2" 필드를 제외

이를 통해 클라이언트에게 민감한 정보를 노출하지 않고 필요한 필드만 반환할 수 있다


게시글 조회 404 에러메세지 구현

if문 조건을 어떻게 설정해야할지 고민하는데 시간이 걸렸다
postid로 찾아온 post가 없으면 띄우는 메세지 이므로 조건문 내부가 거짓이 되어야 하므로 ! 연산자를 활용하여 구현하였다.

if (!post) {
    return res.status(404).json({ message: "게시글을 찾을 수 없습니다." });
  }

게시글수정

강의와같이 update({$set}) 을 수정 항목 하나하나 사용하려다가 이게 맞나 싶어서 튜터님께 질문을 드렸고 다른 방법이 있다고 하셔서 계속 생각하다가 전에 프로그래머스 풀던 방법이 생각나서 아래와 같이 수정했다

post.content = content; // 게시글 내용 수정
post.title = title; // 게시글 제목 수정

수정한 데이터를 db에 반영하기 위해 .save() 메서드를 사용했다

참고
https://squll1.tistory.com/entry/mongodb-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%82%BD%EC%9E%85-%EC%B6%9C%EB%A0%A5-%EC%88%98%EC%A0%95

await post.save(); // 수정된 게시글 저장

update()와 save() 차이

save()는 _id가 존재한다면 오류를 발생시키지 않고 그 값을 수정한다(해당 document에 값을 덮어씌워준다. 따라서 기존 데이터가 사라짐)

update()메소드를 사용하면 특정 필드만 수정가능하다


댓글조회 api 에러 해결

// app.js
app.use("/", [postsRouter, commentsRouter]); 에 댓글라우터를 추가를 안해줬었음

db comment 테이블에 postId 필드가 생기지 않아서 아래와 같이 해결
https://dev.to/ifeanyichima/what-is-ref-in-mongoosejs-4o2h

// schemas/comment.js postId 참조 해와서 추가
  const commentSchema = new mongoose.Schema({
    postId: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "Post",
    required: true,
  },
    
// routes/comments.js
 const createdComment = await Comment.create({
    user,
    password,
    content,
    postId: post._id, // 게시물의 _id 값을 postId 필드로 저장하도록 추가
  });

  • 댓글조회 400에러메세지 안뜸
  • 댓글수정 # 400 body 또는 params를 입력받지 못한 경우
    { message: '데이터 형식이 올바르지 않습니다.' } 메세지 안뜸

0개의 댓글