[node.js] Mongoose를 컴파일 한 후에는 모델을 덮어 쓸 수 없습니다.

내가 뭘 잘못하고 있는지 확실하지 않습니다. 여기 내 check.js가 있습니다.

var db = mongoose.createConnection('localhost', 'event-db');
db.on('error', console.error.bind(console, 'connection error:'));

var a1= db.once('open',function(){
var user = mongoose.model('users',{
       name:String,
       email:String,
       password:String,
       phone:Number,
      _enabled:Boolean
     });

user.find({},{},function (err, users) {
    mongoose.connection.close();
    console.log("Username supplied"+username);
    //doSomethingHere })
    });

그리고 여기에 내 insert.js가 있습니다.

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/event-db')

var user = mongoose.model('users',{
     name:String,
     email:String,
     password: String,
     phone:Number,
     _enabled:Boolean
   });

var new_user = new user({
     name:req.body.name,
     email: req.body.email,
     password: req.body.password,
     phone: req.body.phone,
     _enabled:false
   });

new_user.save(function(err){
    if(err) console.log(err);
   });

check.js를 실행하려고 할 때마다이 오류가 발생합니다.

컴파일 된 후에는 ‘사용자’모델을 덮어 쓸 수 없습니다 .

이 오류는 스키마의 불일치로 인해 발생한다는 것을 이해하지만 어디에서 발생하는지 알 수 없습니다. 저는 mongoose와 nodeJS를 처음 접했습니다.

내 MongoDB의 클라이언트 인터페이스에서 얻은 정보는 다음과 같습니다.

MongoDB shell version: 2.4.6 connecting to: test
> use event-db
  switched to db event-db
> db.users.find()
  { "_id" : ObjectId("52457d8718f83293205aaa95"),
    "name" : "MyName",
    "email" : "myemail@me.com",
    "password" : "myPassword",
    "phone" : 900001123,
    "_enable" : true
  }
>



답변

이미 스키마가 정의되어 있고 다시 스키마를 정의하기 때문에 오류가 발생합니다. 일반적으로 수행해야하는 작업은 스키마를 한 번 인스턴스화 한 다음 필요할 때 전역 개체가 호출하도록하는 것입니다.

예를 들면 :

user_model.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var userSchema = new Schema({
   name:String,
   email:String,
   password:String,
   phone:Number,
   _enabled:Boolean
});
module.exports = mongoose.model('users', userSchema);          

check.js

var mongoose = require('mongoose');
var User = require('./user_model.js');

var db = mongoose.createConnection('localhost', 'event-db');
db.on('error', console.error.bind(console, 'connection error:'));
var a1= db.once('open',function(){
  User.find({},{},function (err, users) {
    mongoose.connection.close();
    console.log("Username supplied"+username);
    //doSomethingHere 
  })
});

insert.js

var mongoose = require('mongoose');
var User = require('./user_model.js');

mongoose.connect('mongodb://localhost/event-db');
var new_user = new User({
    name:req.body.name
  , email: req.body.email
  , password: req.body.password
  , phone: req.body.phone
  , _enabled:false
});
new_user.save(function(err){
  if(err) console.log(err);
});


답변

따라서이 오류가 발생할 수있는 또 다른 이유는 다른 파일에서 동일한 모델을 사용하지만 require경로가 다른 경우입니다. 예를 들어 내 상황에서 나는 다음을 가졌다.

require('./models/User')한 파일에서 내가 가지고있는 사용자 모델에 액세스해야하는 다른 파일에서 require('./models/user').

나는 모듈과 몽구스를 찾는 것이 그것을 다른 파일로 취급하고 있다고 생각합니다. 케이스가 둘 다 일치하는지 확인한 후에는 더 이상 문제가되지 않았습니다.


답변

단위 테스트 중에이 문제가 발생했습니다.

모델 생성 기능을 처음 호출 할 때 mongoose는 사용자가 제공 한 키 (예 : ‘사용자’) 아래에 모델을 저장합니다. 동일한 키로 모델 생성 함수를 두 번 이상 호출하면 mongoose는 기존 모델을 덮어 쓰지 못하게합니다.

모델이 이미 몽구스에 있는지 확인할 수 있습니다.

let users = mongoose.model('users')

모델이 존재하지 않으면 오류가 발생하므로 모델을 가져 오거나 생성하기 위해 try / catch로 래핑 할 수 있습니다.

let users
try {
  users = mongoose.model('users')
} catch (error) {
  users = mongoose.model('users', <UsersSchema...>)
}


답변

테스트를 ‘보는’동안이 문제가 발생했습니다. 테스트가 편집되었을 때 시계는 테스트를 다시 실행했지만 바로 이러한 이유로 실패했습니다.

모델이 있는지 확인하여 수정 한 다음 사용하거나 생성합니다.

import mongoose from 'mongoose';
import user from './schemas/user';

export const User = mongoose.models.User || mongoose.model('User', user);


답변

이 문제가 발생했습니다. 스키마 정의 때문이 아니라 서버리스 오프라인 모드 때문이었습니다.이 문제를 해결했습니다.

serverless offline --skipCacheInvalidation

여기에 언급 된 https://github.com/dherault/serverless-offline/issues/258

서버리스에서 프로젝트를 빌드하고 오프라인 모드를 실행하는 다른 사람에게 도움이되기를 바랍니다.


답변

서버리스를 오프라인으로 사용 중이고을 사용하지 않으려면 --skipCacheInvalidation다음을 매우 잘 사용할 수 있습니다.

module.exports = mongoose.models.Users || mongoose.model('Users', UsersSchema);


답변

당신이 여기에서 그것을 만들었다면 당신은 내가 한 것과 같은 문제를 겪었을 가능성이 있습니다. 내 문제는 내가 같은 이름을 가진 다른 모델을 정의 하고 있었다는 것 입니다. 내 갤러리와 파일 모델을 “파일”이라고했습니다. 복사해서 붙여 넣으세요!