문제
crud 게시판 서버 구현을 하는 중이다.
게시글 작성 API를 구현하는 중에 문제가 발생했다.
수정, 삭제하는데 필요한 게시글의 고유 아이디(postId)를
mongoose의 objectId를 가져와 사용하려고 하는데
정상적으로 생성이 안되는 것이다.
시도
const PostSchema = new Schema({
postId: {
type: Schema.Types.ObjectId, // ObjectId로 변경
required: true,
unique: true,
default: () => mongoose.Types.ObjectId() // default 값으로 ObjectId 생성
},
새로운 document가 생성될 때마다
positId에 mongoose의 objectId를 할당하기 위해 new 키워드를 사용해야 한다고 한다.
그런데 새로운 데이터가 들어올 때마다 schema는 새로 생성되어야 하니 생성자 키워드가 붙어있다.
그런데 왜? 이유를 몰라 애꿏은 router 부분만 수정을 반복했다.
해결
postId: {
type: Schema.Types.ObjectId, // ObjectId로 변경
required: true,
unique: true,
default: () => new mongoose.Types.ObjectId() // default 값으로 ObjectId 생성
},
결국 어이없게 해결이 되었다.
objectId 생성자 함수 앞쪽에 new 키워드를 붙여야 하는 것이다.
저기에 new 키워드를 사용하지 않으면 javascript는 저걸 일반 함수 호출로 처리한다.
알게된 것
ES6 문법에서 화살표 함수를 사용하면 기본적으로 this 바인딩이 되지 않는다.
애초에 this가 없기 때문이다.
따라서 this 바인딩을 위해 new 키워드를 붙여 주는 것이다.
쉽게 말하자면 새롭게 생성되는 mongoose schema를 가리키기 위해
new 키워드를 사용하는 것이다.
그러면 "지금 생성되고 있는 schema에 objectId를 붙여줘!"가 되는 것이다.
'Development > TIL' 카테고리의 다른 글
schema.virtual (0) | 2023.04.20 |
---|---|
this에 대하여 (0) | 2023.04.18 |
TIL - Promise와 await 연산자 (feat. vs GPT) (0) | 2023.04.16 |
JS의 비동기적 처리 (근데 이제 Non - Blocking을 곁들인) (0) | 2023.04.14 |
TIL(feat.프로그래머스 1차 비밀지도) (0) | 2023.04.13 |