Mongoose Schema가 모델에 등록되지 않았습니다.
나는 평균 스택을 배우고 있으며 서버를 시작하려고 할 때
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);
모델 내보내기에는 문제가 없습니다. 나는 같은 문제가 있었다.
진짜 문제는 모델에 대한 진술이 필요하다는 것입니다.
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();
누군가 (나와 같은) 정답의 접근 방식으로 그것을 고칠 수 없다면 스키마 생성을 살펴보십시오. '참조'를 '사용자'로 썼지 만 정답은 '사용자'였습니다.
잘못된:
createdBy: {
type: Schema.Types.ObjectId,
ref: 'User'
}
옳은:
createdBy: {
type: Schema.Types.ObjectId,
ref: 'user'
}
여러 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');
문제를 해결하기 위해 다음 접근 방식을 사용했습니다.
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
스키마를 참조하고 있습니다.
.\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);
이 오류는 몽구스 모델간에 잘못된 참조 (ref)를 생성 할 때도 나타납니다.
In my case I was referring to the file name instead of model name.
eg:
const userModel = mongoose.model("user", userSchema);
We should refer to 'user' (model name) instead of 'User' (file name);
Elaborating on Rafael Grilli's answer above,
Correct:
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');
You should also check that you don't have dirty data in your database. I ended up with a document containing the lowercased version of the referenced model (user
instead of User
). This causes the error and is incredibly hard to track down.
Easy to fix with a quick mongo query:
db.model.updateMany({ approvedByKind: 'user' }, { $set: { approvedByKind: 'User' } })
In my case, this issue because I haven't included the model or ref model into the application. So you should required Post model
and Comment model
in your node application.
Refer the same name that you refer in model name while creating new model.
For example: if I have mongoose model like:
var Post = mongoose.model("post",postSchema);
Then I have to refer to posts collection via writing ref:"post"
.
Here's https://mongoosejs.com/docs/populate.html#cross-db-populate
It says we have to pass the model as a third argument.
For e.g.
//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);
참고URL : https://stackoverflow.com/questions/26818071/mongoose-schema-hasnt-been-registered-for-model
'program tip' 카테고리의 다른 글
인터페이스 인스턴스 컬렉션을 역 직렬화 하시겠습니까? (0) | 2020.12.10 |
---|---|
변수가 angularjs 약속인지 알 수있는 방법이 있습니까? (0) | 2020.12.10 |
대규모 개발에 Python을 어떻게 사용할 수 있습니까? (0) | 2020.12.10 |
JavaScript를 통해 HTML 파일 업로드 필드 지우기 (0) | 2020.12.10 |
한쪽에만 CSS 테두리를 설정하려면 어떻게해야합니까? (0) | 2020.12.10 |