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