[node.js] 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
스키마를 참조하고 있습니다.
답변
이 오류는 몽구스 모델간에 잘못된 참조 (ref)를 만들 때도 나타납니다.
제 경우에는 모델 이름 대신 파일 이름을 참조했습니다.
예 :
const userModel = mongoose.model("user", userSchema);
‘사용자'(파일 이름) 대신 ‘사용자'(모델 이름)를 참조해야합니다.
답변
다음은 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);
답변
.\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);