복붙노트

[MONGODB] 하지 덮어 쓰기 모델은 한 번 몽구스를 컴파일 할 수

MONGODB

하지 덮어 쓰기 모델은 한 번 몽구스를 컴파일 할 수

모르겠 내가 잘못을 뭘하는지, 여기 내 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려고 할 때마다,이 오류를 받고 있어요

덮어 쓰기 '사용자'모델은 한 번 컴파일 할 수 없습니다.

이 오류로 인해 스키마의 미스 매칭에 관해서 이해하지만 이런 일이 어디 볼 ​​수없는 이유는 무엇입니까? 나는 몽구스와 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 
  } 
>

해결법

  1. ==============================

    1.이미 정의 된 스키마를 가지고 있기 때문에 오류가 발생하고 다시 스키마를 정의하고 있습니다. 일반적으로 당신이해야 할 것은 인스턴스화 한 번 스키마이며, 다음이 그것을 필요로하는 전역 객체 호출을 가지고있다.

    이미 정의 된 스키마를 가지고 있기 때문에 오류가 발생하고 다시 스키마를 정의하고 있습니다. 일반적으로 당신이해야 할 것은 인스턴스화 한 번 스키마이며, 다음이 그것을 필요로하는 전역 객체 호출을 가지고있다.

    예를 들면 :

    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); 
    });
    
  2. ==============================

    2.당신이 다른 파일에 같은 모델을 사용하지만 경로가 다른 경우가 있습니다 필요한 경우 그래서 당신이 오류를 얻을 수있는 또 다른 이유이다. 내 상황에서 예를 들어 내가했다 :

    당신이 다른 파일에 같은 모델을 사용하지만 경로가 다른 경우가 있습니다 필요한 경우 그래서 당신이 오류를 얻을 수있는 또 다른 이유이다. 내 상황에서 예를 들어 내가했다 :

    필요 ( './ 모델 / 사용자) 하나 개의 파일에 다음 나는 ('./ 모델 / 사용자 ')를 필요로했던 사용자 모델에 대한 액세스를 필요로 다른 파일입니다.

    나는 모듈의 모양을 추측 & 몽구스는 다른 파일로 취급된다. 나는 모두 일치하는 경우를 확인했다되면 더 이상 문제가 없었다.

  3. ==============================

    3.내가 단위 테스트 동안이 문제를 가지고 있었다.

    내가 단위 테스트 동안이 문제를 가지고 있었다.

    당신이 모델 생성 함수를 호출 처음으로, 당신은 (예를 들어, '사용자')를 제공하는 키에 저장에게 모델을 몽구스. 당신이 한 번 이상 같은 키를 사용하여 모델 생성 함수를 호출하는 경우, 몽구스는 기존 모델을 덮어하지 않습니다.

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

    let users = mongoose.model('users')
    

    모델이 존재하지 않는 경우에 순서대로 시도 / 캐치에 포장하거나 모델을 얻을, 또는 그것을 만들 수 있도록이 오류가 발생합니다 :

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

    4.테스트를 '보고'하는 동안이 문제를 가지고 있었다. 테스트를 편집 할 때, 시계 테스트를 재 - 실행하지만이 매우 이유로 인해 실패했습니다.

    테스트를 '보고'하는 동안이 문제를 가지고 있었다. 테스트를 편집 할 때, 시계 테스트를 재 - 실행하지만이 매우 이유로 인해 실패했습니다.

    나는 모델이 다음을 만드는 사람, 그것을 사용 존재하는 경우 확인하여 해결했습니다.

    import mongoose from 'mongoose';
    import user from './schemas/user';
    
    export const User = mongoose.models.User || mongoose.model('User', user);
    
  5. ==============================

    5.나는이 문제가 발생되어왔다 & 그것 때문에 스키마 정의의 것이 아니라 서버를 사용하지 않는 오프라인 모드의 아니었다 - 난 그냥이 그것을 해결하기 위해 관리 :

    나는이 문제가 발생되어왔다 & 그것 때문에 스키마 정의의 것이 아니라 서버를 사용하지 않는 오프라인 모드의 아니었다 - 난 그냥이 그것을 해결하기 위해 관리 :

    serverless offline --skipCacheInvalidation
    

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

    바라건대 그 서버를 사용하지 않는 그들의 프로젝트를 구축하고 오프라인 모드를 실행하는 다른 사람이 도움이됩니다.

  6. ==============================

    6.당신이 서버를 사용하지 않는 오프라인을 사용하고 --skipCacheInvalidation을 사용하지 않으려면, 당신은 아주 잘 사용할 수 있습니다 :

    당신이 서버를 사용하지 않는 오프라인을 사용하고 --skipCacheInvalidation을 사용하지 않으려면, 당신은 아주 잘 사용할 수 있습니다 :

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

    7.당신이 여기 한 경우 당신이 내가했던 동일한 문제가 있다고 할 수있다. 내 문제는 내가 같은 이름의 다른 모델을 정의 된 것이 었습니다. 나는 내 갤러리 내 파일 모델 "파일"을 불렀다. 복사 및 붙여 넣기 젠장!

    당신이 여기 한 경우 당신이 내가했던 동일한 문제가 있다고 할 수있다. 내 문제는 내가 같은 이름의 다른 모델을 정의 된 것이 었습니다. 나는 내 갤러리 내 파일 모델 "파일"을 불렀다. 복사 및 붙여 넣기 젠장!

  8. ==============================

    8.나는 다음과 같이 쓸 때이 나에게 무슨 일이 있었 :

    나는 다음과 같이 쓸 때이 나에게 무슨 일이 있었 :

    import User from '../myuser/User.js';
    

    그러나 진정한 경로는 '../myUser/User.js'입니다

  9. ==============================

    9.나는 추가하여 해결

    나는 추가하여 해결

    mongoose.models = {}
    

    라인 전 :

    mongoose.model(<MODEL_NAME>, <MODEL_SCHEMA>)
    

    희망은 당신의 문제를 해결

  10. ==============================

    10.나는 허용 솔루션이 알고 있지만 기분이 너무 당신이 모델을 테스트 할 수있는 보일러를 많이에서 현재 솔루션 결과. 내 솔루션은 모델링 걸릴 모델이 등록되어 있지 않은 경우 새로운 모델을 반환하지만이 경우 기존의 모델을 반환하는 결과 함수의 내부에 배치하는 본질적으로.

    나는 허용 솔루션이 알고 있지만 기분이 너무 당신이 모델을 테스트 할 수있는 보일러를 많이에서 현재 솔루션 결과. 내 솔루션은 모델링 걸릴 모델이 등록되어 있지 않은 경우 새로운 모델을 반환하지만이 경우 기존의 모델을 반환하는 결과 함수의 내부에 배치하는 본질적으로.

    function getDemo () {
      // Create your Schema
      const DemoSchema = new mongoose.Schema({
        name: String,
        email: String
      }, {
        collection: 'demo'
      })
      // Check to see if the model has been registered with mongoose
      // if it exists return that model
      if (mongoose.models && mongoose.models.Demo) return mongoose.models.Demo
      // if no current model exists register and return new model
      return mongoose.model('Demo', DemoSchema)
    }
    
    export const Demo = getDemo()
    

    사방에 개폐 연결은 실망 잘 압축하지 않습니다.

    내가 오류를 얻을 수 없겠죠 모든 올바른 정보가 반환되는 내 시험에서 모델이 개 다른 장소 또는 더 구체적를 필요로한다면이 방법.

  11. ==============================

    11.이 같은 컬렉션 이름이 다른 스키마의를 정의하는 경우이 문제가 발생할 수 있습니다

    이 같은 컬렉션 이름이 다른 스키마의를 정의하는 경우이 문제가 발생할 수 있습니다

  12. ==============================

    12.

    If you want to overwrite the existing class for different collection using typescript
    then you have to inherit the existing class from different class.
    
    export class User extends Typegoose{
      @prop
      username?:string
      password?:string
    }
    
    
    export class newUser extends User{
        constructor() {
            super();
        }
    }
    
    export const UserModel = new User ().getModelForClass(User , { schemaOptions: { collection: "collection1" } });
    
    export const newUserModel = new newUser ().getModelForClass(newUser , { schemaOptions: { collection: "collection2" } });
    
  13. ==============================

    13.모델 생성을 할 전에 존재하는 경우이 검사를 해결하려면 :

    모델 생성을 할 전에 존재하는 경우이 검사를 해결하려면 :

    if (!mongoose.models[entityDBName]) {
      return mongoose.model(entityDBName, entitySchema);
    }
    else {
      return mongoose.models[entityDBName];
    }
    
  14. ==============================

    14.스키마 정의가 수집 고유해야, 그것은 수집을 위해 두 개 이상의 스키마해서는 안됩니다.

    스키마 정의가 수집 고유해야, 그것은 수집을 위해 두 개 이상의 스키마해서는 안됩니다.

  15. ==============================

    15.스키마가 이미 있기 때문에, 검증 전에 새 스키마를 만드는 것입니다.

    스키마가 이미 있기 때문에, 검증 전에 새 스키마를 만드는 것입니다.

    var mongoose = require('mongoose');
    module.exports = function () {
    var db = require("../libs/db-connection")();
    //schema de mongoose
    var Schema = require("mongoose").Schema;
    
    var Task = Schema({
        field1: String,
        field2: String,
        field3: Number,
        field4: Boolean,
        field5: Date
    })
    
    if(mongoose.models && mongoose.models.tasks) return mongoose.models.tasks;
    
    return mongoose.model('tasks', Task);
    
  16. ==============================

    16.당신은 쉽게 수행하여이 문제를 해결할 수

    당신은 쉽게 수행하여이 문제를 해결할 수

    delete mongoose.connection.models['users'];
    const usersSchema = mongoose.Schema({...});
    export default mongoose.model('users', usersSchema);
    
  17. ==============================

    17.나는 각각의 요청 때문에 나는이 오류를받은 동적으로 모델을 만들어야 할 상황이, 그러나, 나는 그것이 다음과 같은 요소 편집 방법을 사용하고 해결하기 위해 무엇을 사용 :

    나는 각각의 요청 때문에 나는이 오류를받은 동적으로 모델을 만들어야 할 상황이, 그러나, 나는 그것이 다음과 같은 요소 편집 방법을 사용하고 해결하기 위해 무엇을 사용 :

    var contentType = 'Product'
    
    var contentSchema = new mongoose.Schema(schema, virtuals);
    
    var model = mongoose.model(contentType, contentSchema);
    
    mongoose.deleteModel(contentType);
    

    나는이 사람을 도울 수 있기를 바랍니다.

  18. ==============================

    18.

    The reason of this issue is: 
    
    you given the model name "users" in the line 
    <<<var user = mongoose.model('users' {>>> in check.js file
    
    and again the same model name you are giving in the insert file
    <<< var user = mongoose.model('users',{ >>> in insert.js
    
    This "users" name shouldn't be same when you declare a model that should be different 
    in a same project.
    
  19. ==============================

    19.때문에 Typegoose와 몽구스의 혼합과 코드베이스의 여기 끝나는 모든 사람들을 위해 :

    때문에 Typegoose와 몽구스의 혼합과 코드베이스의 여기 끝나는 모든 사람들을 위해 :

    각 하나에 대한 DB 연결을 만듭니다

    몽구스 :

    module.exports = db_mongoose.model("Car", CarSchema);
    

    거위를 입력 :

    db_typegoose.model("Car", CarModel.schema, "cars");
    
  20. ==============================

    20.당신이 expressjs로 작업하는 경우, 당신은 스크립트가 인스턴스화 될 때 일단 만이라고 있도록 () 모델 정의 외부의 app.get를 이동해야 할 수도 있습니다.

    당신이 expressjs로 작업하는 경우, 당신은 스크립트가 인스턴스화 될 때 일단 만이라고 있도록 () 모델 정의 외부의 app.get를 이동해야 할 수도 있습니다.

  21. from https://stackoverflow.com/questions/19051041/cannot-overwrite-model-once-compiled-mongoose by cc-by-sa and MIT license