복붙노트

[MONGODB] 몽구스 스키마 모델에 등록되지 않은

MONGODB

몽구스 스키마 모델에 등록되지 않은

나는 평균 스택을 배우고 때 나는 사용하여 서버를 시작하려고

npm start

나는 그 말을 예외가 :

schema hasn't been registered for model 'Post'. Use mongoose.model(name, schema)

여기 /models/Posts.js 안에 내 코드입니다

var mongoose = require('mongoose');

var PostSchema = new mongoose.Schema({
    title: String,
    link: String, 
    upvotes: { type: Number, default: 0 },
    comments: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Comment' }]
});

mongoose.model('Post', PostSchema);

나는 스키마가 '포스트'모델에 등록해야 볼 수 있지만 던져 질 예외를 일으키는 가능성이 무엇을 할 수?

미리 감사드립니다.

편집 : 여기에 예외 오류입니다

/home/arash/Documents/projects/personal/flapper-news/node_modules/mongoose/lib/index.js:323
  throw new mongoose.Error.MissingSchemaError(name);
        ^
MissingSchemaError: Schema hasn't been registered for model "Post".
Use mongoose.model(name, schema)

여기 몽구스 초기화와 app.js 코드는 다음과 같습니다

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/news');
require('./models/Posts');
require('./models/Comments');

라인 전 :

app.use('/', routes);

해결법

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

    1.이 모델 수출에 문제가 아니에요. 저도 같은 문제를 가지고 있었다.

    이 모델 수출에 문제가 아니에요. 저도 같은 문제를 가지고 있었다.

    진짜 문제는 그 모델에 대한 문을 필요로한다

    var mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost/news');
    require('./models/Posts');
    require('./models/Comments');
    

    경로 의존성의 밑에 있었다. 단순히 경로 의존성 위의 MongoDB의 종속성을 이동합니다. 이것은 어떻게 보일지입니다 :

    // MongoDB
    var mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost/news');
    require('./models/Posts');
    require('./models/Comments');
    
    var routes = require('./routes/index');
    var users = require('./routes/users');
    
    var app = express();
    
  2. ==============================

    2.(나 같은) 정답의 접근 방식을 가진 사람의 coudn't 수정은 스키마의 생성을보고하려고합니다. 나는 '사용자'와 '심판'을 쓴하지만, 올바른은 '사용자'입니다.

    (나 같은) 정답의 접근 방식을 가진 사람의 coudn't 수정은 스키마의 생성을보고하려고합니다. 나는 '사용자'와 '심판'을 쓴하지만, 올바른은 '사용자'입니다.

    잘못된:

    createdBy: {
        type: Schema.Types.ObjectId,
        ref: 'User'
    }
    

    옳은:

    createdBy: {
        type: Schema.Types.ObjectId,
        ref: 'user'
    }
    
  3. ==============================

    3.IF YOU 사용 MULTIPLE의 MongoDB의 연결 상태

    IF YOU 사용 MULTIPLE의 MongoDB의 연결 상태

    .populate를 사용하는 경우 몽구스는 동일한 연결에 모델을 "발견"하므로 ()는 모델을 제공해야 조심. 여기서 즉 :

    var db1 = mongoose.createConnection('mongodb://localhost:27017/gh3639');
    var db2 = mongoose.createConnection('mongodb://localhost:27017/gh3639_2');
    var userSchema = mongoose.Schema({
      "name": String,
      "email": String
    });
    
    var customerSchema = mongoose.Schema({
      "name" : { type: String },
      "email" : [ String ],
      "created_by" : { type: mongoose.Schema.Types.ObjectId, ref: 'users' },
    });
    
    var User = db1.model('users', userSchema);
    var Customer = db2.model('customers', customerSchema);
    

    옳은:

    Customer.findOne({}).populate('created_by', 'name email', User)
    

    또는

    Customer.findOne({}).populate({ path: 'created_by', model: User })
    

    잘못된 (오류 "스키마 모델에 등록되지 않은"생산) :

    Customer.findOne({}).populate('created_by');
    
  4. ==============================

    4.나는이 문제를 해결하기 위해 다음과 같은 방법을 사용

    나는이 문제를 해결하기 위해 다음과 같은 방법을 사용

    const mongoose = require('mongoose');
    const Comment = require('./comment');
    
    const PostSchema = new mongoose.Schema({
                title: String,
                link: String, 
                upvotes: { type: Number, default: 0 },
                comments: [{ type: mongoose.Schema.Types.ObjectId, ref: Comment }]
            });
    mongoose.model('Post', PostSchema);
    

    봐, 여기에 심판 지금은 주석 스키마를 참조 것, 문자열 유형 값이하지 마십시오.

  5. ==============================

    5.이 오류는 또한 우리가 몽구스 모델 사이의 잘못된 참조 (REF)를 만들 때 나타납니다.

    이 오류는 또한 우리가 몽구스 모델 사이의 잘못된 참조 (REF)를 만들 때 나타납니다.

    내 경우에는 내가 대신 모델 이름의 파일 이름을 언급했다.

    예를 들면 :

    CONST userModel = mongoose.model ( "사용자"userSchema);

    우리는 '사용자'(모델명) 대신 '사용자'(파일 이름)의 참조해야합니다;

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

    6.

    .\nodeapp\node_modules\mongoose\lib\index.js:452
          throw new mongoose.Error.MissingSchemaError(name);
          ^
    MissingSchemaError: Schema hasn't been registered for model "users".
    Use mongoose.model(name, schema)
        at new MissingSchemaError
    

    이 오류는 server.js의 경우 사용의 setTimeout을 해결되었다

    mongoose.connect(env.get('mongodb.uri'), { useNewUrlParser: true })
      .then(() => logger.info("MongoDB successfully connected"))
      .catch(err => logger.error(err));
    app.use(passport.initialize());
    setTimeout(function() {
      require("./src/utils/passport")(passport);
    }, 3000);
    
  7. ==============================

    7.위 라파엘 Grilli의 답변에 부연,

    위 라파엘 Grilli의 답변에 부연,

    옳은:

    var HouseSchema = new mongoose.Schema({
      date: {type: Date, default:Date.now},
      floorplan: String,
      name:String,
      house_id:String,
      addressLine1:String,
      addressLine2:String,
      city:String,
      postCode:String,
      _locks:[{type: Schema.Types.ObjectId, ref: 'xxx'}] //ref here refers to the first parameter passed into mongoose.model()
    });
    var House = mongoose.model('xxx', HouseSchema, 'houseschemas');
    
  8. ==============================

    8.당신은 또한 당신의 데이터베이스에 더러운 데이터가없는 것을 확인해야합니다. 나는 참조 모델의 소문자 버전 (대신 사용자의 사용자)가 포함 된 문서로 끝났다. 이 오류를 발생하고 추적하는 것이 매우 어렵다.

    당신은 또한 당신의 데이터베이스에 더러운 데이터가없는 것을 확인해야합니다. 나는 참조 모델의 소문자 버전 (대신 사용자의 사용자)가 포함 된 문서로 끝났다. 이 오류를 발생하고 추적하는 것이 매우 어렵다.

    빠른 몽고의 쿼리를 쉽게 수정할 수 :

    db.model.updateMany({ approvedByKind: 'user' }, { $set: { approvedByKind: 'User' } })
    
  9. ==============================

    9.내 경우에는이 문제 나 응용 프로그램에 모델 또는 심판 모델을 포함하지 않았기 때문에. 그래서 당신은 당신의 노드 응용 프로그램에서 포스트 모델과 코멘트 모델이 필요합니다.

    내 경우에는이 문제 나 응용 프로그램에 모델 또는 심판 모델을 포함하지 않았기 때문에. 그래서 당신은 당신의 노드 응용 프로그램에서 포스트 모델과 코멘트 모델이 필요합니다.

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

    10.새로운 모델을 만드는 동안 모델 이름을 참조하는 것이 같은 이름을 참조하십시오.

    새로운 모델을 만드는 동안 모델 이름을 참조하는 것이 같은 이름을 참조하십시오.

    예를 들어 내가 좋아하는 몽구스 모델이있는 경우 :

    var Post = mongoose.model("post",postSchema);
    

    "포스트"그 때 나는 쓰기 심판을 통해 글 모음을 참조해야합니다.

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

    11.여기에 https://mongoosejs.com/docs/populate.html#cross-db-populate입니다

    여기에 https://mongoosejs.com/docs/populate.html#cross-db-populate입니다

    우리가 세 번째 인수로 모델을 통과해야했다.

    의 경우 예를 들어,

    // 사용자 모델 필요 const를 UserModel = 필요 ( './../ 모델 / 사용자'); 포스트 모델을 필요 // CONST PostModel =은 ( './../ 모델 / 포스트')이 필요합니다; CONST 글 = await를 PostModel.find ({})             ALL 기타 사항 서보 -OFF ( '-__ V')             {(.populate               경로 : '사용자',               선택 : '이름 -_id'               모델 : UserModel             }); //또는 CONST 글 = await를 PostModel.find ({})             ALL 기타 사항 서보 -OFF ( '-__ V')             .populate ( '사용자', '이름', UserModel);

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

    12.나는 또한 같은 문제에 직면하지만 난 module.exports을 제거하여 해결

    나는 또한 같은 문제에 직면하지만 난 module.exports을 제거하여 해결

    const mongoose = require('mongoose');
    const ObjectId = require('mongoose').ObjectId;
    
    var userSchema = new mongoose.Schema({
        Password: { type: String },  
        Email: { type: String, required: 'This field is required.', unique:true },  
        songs: [{ type: ObjectId, ref: 'Songs'}]
    });
    
    // Custom validation for email
    userSchema.path('Email').validate((val) => {
        emailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
        return emailRegex.test(val);
    }, 'Invalid e-mail.');
    
    // module.exports = mongoose.model('user', userSchema);  // remove 'module.exports ='
    mongoose.model('user', userSchema); // resolved issue
    
  13. from https://stackoverflow.com/questions/26818071/mongoose-schema-hasnt-been-registered-for-model by cc-by-sa and MIT license