Node.js

[NodeJS] Error : Cannot overwrite users model once compiled

SongMinu 2022. 6. 24. 14:22
728x90

이미 정의된 모델이 있는 상태에서 다시 또 모델을 정의하려는 경우 발생하는 에러다.

처음 이 에러 문구를 보고 내 로직상에서 이 상황 자체가 좀 이해가 안 됐었는 데

먼저 해결 방법부터 말하면

import mongoose from "mongoose";

const { Schema } = mongoose;

const userSchema = new Schema({
  email: {
    type: String,
    required: true,
    unique: true,
  },
  password: {
    type: String,
    required: true,
  },
  name: {
    type: String,
    required: true,
  },
  nickName: {
    type: String,
    required: true,
  },
  image: String,
  desc: String
})

module.exports = mongoose.model('users', userSchema);

이런 식으로 스키마 생성자를 통해 모델을 정의한게 있으면 맨 마지막 줄을 아래처럼 바꿔주면 된다.

module.exports = mongoose.models.users || mongoose.model('users', userSchema);

이렇게 하면 끝난다.

이미 정의된게 있으면 그걸로 쓰고 없으면 모델을 정의해주도록.

 

내가 겪은 상황은 vue2기반 nuxt로 토이 프로젝트를 하나 만들고 있는데,

작은 규모로 만들 생각이라 백엔드를 분리하지 않고 nuxt 내부에 serverMiddleware를 사용해 express를 탑재해서 몽고DB 세팅을 했다.

모델들 세팅도 다 해서 데이터를 잘 불러오는지 테스트를 하기 위해

위와 같이 소스 코드를 짠 후 API 요청을 날려서 데이터를 불러오는 것을 확인 했다.

이후 조금 더 확인해볼 게 있어서 소스를 수정 후 저장을 누르니 

이런 에러가 발생했다.

nuxt에서 개발모드로 실행중일 때, 소스를 수정하면 다시 빌드를 하는 데,

난 이 과정에서 정의된 모델들도 초기화 후 다시 생성이 될 거라 생각했다.

그래서 왜 덮어쓸 수가 없다는 에러가 뜨는 건지 이해가 안 돼서 로직을 잘못 짠건가 생각하고 계속 로직만 바꾸고 있었다.

 

이 글을 쓰면서 문득 생각난게, nuxt에서 프론트단은 수정되면 다시 빌드하는 로딩바가 출력되고, 백단 쪽이 수정될 땐 다시 빌드하는 거 없이 serverMiddleware 쪽 파일만 다시 읽고 수정됐다는 문구만 딱 찍히긴 하네.....

 

nuxt에서 하다 발생한 문제라 카테고리를 vue에 넣을까 하다가 문제가 된 부분은 express 쪽이라 Node 카테고리에 작성함

반응형