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에서 쿼리 결과에서 특정 필드를 선택하거나 제외할 때 사용(쿼리에 적용되어 반환되는 문서의 필드를 제어)
사용법
원하는 필드 선택:
.select("field1 field2")와 같이 사용하여 "field1"과 "field2" 필드를 선택필드 제외:
- 기호를 사용하여.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() 메서드를 사용했다
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 필드로 저장하도록 추가
});