Mongoose Schema가 모델에 등록되지 않았습니다.


80

나는 평균 스택을 배우고 있으며 서버를 시작하려고 할 때

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);

내가 볼 수 있듯이 스키마는 'Post'모델에 등록되어야하지만 예외가 throw되는 원인은 무엇입니까?

미리 감사드립니다.

편집 : 다음은 예외 오류입니다.

/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);

당신은 다른 곳에서 실수하고 있습니다. 위의 코드는 유효합니다. 아마도 Post.js어딘가에 "필요"(ing) 하지만 모델을 "내 보낸"적이 없을 수도 있습니다.
Neil Lunn 2014

@NeilLunn ok, 그게 내가 읽을 수있는 전부이기 때문에 예외 오류로 질문을 편집하겠습니다. 내가 볼 수없는 것을 다른 사람들이 볼 수 있을지도 모릅니다
arash moeen 2014

@Umm. 나중에 "필요한"곳을 "내 보낸"적이 있습니까? 여기에없는 코드라고 생각합니다.
Neil Lunn 2014

@NeilLunn app.js에서 의미합니까? app.js 코드도 넣어 보겠습니다 (mongoose 부분 만 해당)
arash moeen 2014

그 ID가 코드라면 모델을 "내 보낸"적이 없습니다. 이런 지금 세 번. 당신은 지금까지 이것을 얻을 것입니다.
Neil Lunn 2014

답변:


142

모델 내보내기에는 문제가 없습니다. 나는 같은 문제가 있었다.

진짜 문제는 모델에 대한 진술이 필요하다는 것입니다.

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();

@Mark 주석 the var mongoose = require ( "mongoose"); 그리고 코멘트와 포스트를 비슷하게 추가하고 var Posts = require ( "Posts"); 직접 router.get 및 router.post 내부와 유사하게 댓글에 대한
Dhyey

이것은 스키마 오류를 해결하는 것처럼 보였지만 이제에서 "라우터가 정의되지 않았습니다"오류가 routes/index.js있습니다. 누락 된 참조 오류가 무엇인지 이해하지만 인스턴스화 할 필요가 없다고 생각했습니다. 누구든지 이것을 얻습니까?
gin93r

@maiamachine Thinkster 튜토리얼을 작동시킨 적이 있습니까? 나는 약 일주일 동안 작업을 해왔고 모든 곳에서 임의의 문제에 시달렸습니다. jsFiddle 등에서 작업 코드를 게시 할 수 있습니까?
Travis Heeter 2017 년

@ user8264 : 동적으로 생성 된 스키마 모델에 대한 개념을 구현하는 방법은 무엇입니까?
Pappa S

48

누군가 (나와 같은) 정답의 접근 방식으로 그것을 고칠 수 없다면 스키마 생성을 살펴보십시오. '참조'를 '사용자'로 썼는데 정답은 '사용자'였습니다.

잘못된:

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

옳은:

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

2
내 문제 수정 :)
midhun k

32

여러 mongoDB 연결을 사용하는 경우


.populate ()를 사용할 때 mongoose는 동일한 연결에서 모델 만 "찾기"하므로 모델을 제공해야합니다. 즉, 여기서 :

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');

2
이 솔루션은 내 문제를 해결했습니다! findOne({}).populate({ path: 'created_by', model: User })
Ricardo Silva

나를 위해 했어요. 감사합니다 봉오리
하기 Aleks

@ user3616725 : 동적으로 생성 된 스키마 모델에 대한 개념을 구현하는 방법은 무엇입니까?
Pappa S

1
@PappaS 모델 이름을 알고있는 한 모델 인스턴스 대신 모델 이름을 지정할 수 있습니다. Customer.findOne({}).populate({ path: 'created_by', model: 'User' })하지만 모델은 동일한 몽구스 인스턴스에 이미 등록되어 있어야합니다.
user3616725

13

다음 접근 방식을 사용하여 문제를 해결했습니다.

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);

여기 ref에는 string유형 값 이 없습니다 . 이제 Comment스키마를 참조하고 있습니다.


1
Thx 많은, 그것은 쉽게 작동하도록 수십 가지 변형을 시도한 후 나에게 유일한 방법이었습니다.
Stefan Walther

동적으로 생성 된 스키마 모델에 대한 개념을 구현하는 방법은 무엇입니까?
Pappa S

4

이 오류는 몽구스 모델간에 잘못된 참조 (ref)를 만들 때도 나타납니다.

제 경우에는 모델 이름 대신 파일 이름을 참조했습니다.

예 :

const userModel = mongoose.model("user", userSchema);

'사용자'(파일 이름) 대신 '사용자'(모델 이름)를 참조해야합니다.


모델이 다른 몽구스 모델을 참조하는 동안 동일한 문제가 발생했습니다. 귀하의 답변에 영감을 받아 현재 MongoDB 컬렉션이 참조하는 올바른 MongoDB 컬렉션 이름으로 변경하십시오. 문제 해결됨. 대단히 감사합니다.
GoodApple

3

다음은 https://mongoosejs.com/docs/populate.html#cross-db-populate입니다.

세 번째 인수로 모델을 전달해야한다고 말합니다.

예를 들어

//Require User Model
const UserModel = require('./../models/User');
//Require Post Model
const PostModel = require('./../models/Post');
const posts = await PostModel.find({})
            .select('-__v')
            .populate({
              path: 'user',
              select: 'name -_id',
              model: UserModel
            });
//or 
const posts = await PostModel.find({})
            .select('-__v')
            .populate('user','name', UserModel);


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

1

문제는 심판과 관련이 있습니다. 항상 모델에서 내보내는 이름에 대한 참조를 참조해야합니다.

// 모델

const Task = mongoose.model('**Tasks**', taskSchema);

// 참조

userSchema.virtual('tasks', {
ref: '**Tasks**',
localField: '_id', // field in current model
foreignField: 'owner' // corresponding field in other model

});


1

나는 또한 같은 문제에 직면했다. 내 문제에 대한 해결책은 실제로 내보내는 모델과 다른 이름을 가진 ref 매개 변수를보고 있었으므로 그러한 모델이 발견되지 않았습니다.

userSchema.virtual('tasks', {
    ref: 'Task',
    localField: '_id',
    foreignField: 'owner'
})
  

내가 실제로 내 보낸 것은 :-

const Tasks = mongoose.model('Tasks', taskSchema)

module.exports = Tasks

문제가 해결 된 Task대로 수정 한 후Tasks


0

위의 Rafael 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');

0

또한 데이터베이스에 더티 데이터가 없는지 확인해야합니다. 참조 된 모델의 소문자 버전이 포함 된 문서 ( user대신 User)가 작성되었습니다. 이로 인해 오류가 발생하고 추적하기가 매우 어렵습니다.

빠른 mongo 쿼리로 쉽게 수정할 수 있습니다.

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

0

제 경우에는 모델 또는 참조 모델을 애플리케이션에 포함하지 않았기 때문에이 문제가 발생합니다. 당신이 필요합니다 그래서 Post modelComment model노드 응용 프로그램입니다.


0

새 모델을 만들 때 모델 이름에서 참조하는 것과 동일한 이름을 참조하십시오.

예를 들어 다음과 같은 몽구스 모델이있는 경우 :

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

그런 다음 글을 통해 게시물 모음을 참조해야합니다 ref:"post".


0

나는 또한 같은 문제에 직면했지만 module.exports 를 제거하여 해결했습니다.

module.exports = mongoose.model ( 'user', userSchema); // module.exports를 제거하고 다음
과 같이 사용합니다. mongoose.model ( 'user', userSchema);

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

0

내 문제는 아래를 사용하여 분류되었습니다.

adminModel.findById (req.params.id) .populate ({path : "users", 모델 : userModel // 사용자 컬렉션 이름})


0

나를 위해 그것을 추가하고 싶었습니다. Schema를 가져올 때 destructuring을 사용하여 실패했습니다.

옳은

var intakeSchema = require('../config/models/intake')

틀렸다

var { intakeSchema } = require('../config/models/intake')

0

모델에 가치를 부여하지 않습니다.

제 경우에는 MongoDB 연결을 만들 때 업데이트하지 않은 모델을 사용하고있었습니다.

그래서 나는

const Device = require('../../models/device')
// make use of Device

이 연결로

conn = await mongo.createConnection(conn,
      [JobApplication, Job, User])

고치다

conn연결을 시작할 때에 모델을 추가 해야합니다.

conn = await mongo.createConnection(conn,
      [JobApplication, Job, User, Device])

Device연결에 추가 했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.