본문 바로가기

Development/TIL

mongoose objectId와 new 키워드

문제

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를 붙여줘!"가 되는 것이다.