source

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

nicesource 2023. 2. 23. 22:54
반응형

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

MEAN 스택을 사용하여 를 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'에 스키마를 등록해야 하는데, 왜 예외가 발생합니까?

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

/home/me/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)

다음은 mongoose 초기화 앱 코드입니다.

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

누군가 (나처럼) 정답의 접근법으로 그것을 수정하지 못할 경우 스키마가 생성되었는지 살펴보십시오.나는 ref를 User라고 썼는데, 정답은 User였다.

틀렸다:

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

// model creation - notice the registered model name as first parameter
var User = db1.model('_users_', userSchema);
var Customer = db2.model('_customers_', customerSchema);

올바른 접근법:

// you can pass a model instance
Customer.findOne({}).populate('created_by', 'name email', User)
Customer.findOne({}).populate({ path: 'created_by', select: 'name email', model: User })

// you can pass the model NAME as string (even from variable)
Customer.findOne({}).populate('created_by', 'name email', '_users_')
Customer.findOne({}).populate({ path: 'created_by', model: '_users_' })

var otherSchemaName = '_'+'users'+'_'
Customer.findOne({}).populate({ path: 'created_by', model: otherSchemaName}) 

올바르지 않음(제품 "Schema has not registered for model" 오류):

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

Mongoose는 이 답변을 바탕으로 이 사례를 문서에 포함시킨 것으로 보입니다.https://mongoosejs.com/docs/populate.html#cross-db-populate 를 참조하십시오.

문제를 해결하기 위해 다음과 같은 방법을 사용했습니다.

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스키마

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

다른 모델에 종속된 모델을 사용하지만 다른 모델이 아직 등록되지 않은 경우 이 문제가 발생합니다.

a simple fix would be adding 간단한 수정은 추가되는 것이다.model to popualte instead of depending on 의지하지 않고 팝으로 만들다ref스키마에서

=> 예

const jobs = await Job.find({}).populate({
    path: "jobDescriptions",
    model: JobDesc,
    select: "list",
    populate: {
      path: "list",
      select:"name list",
      model: Skill,
    },
  });

참조에 문제가 있으므로 항상 모델에서 내보내는 모든 이름을 참조해야 합니다.

// 모델

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

//참조

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

});

이 에러는, mongoose 모델간에 잘못된 참조(ref)를 작성하는 경우에도 표시됩니다.

제 경우 모델명이 아닌 파일명을 참조하고 있었습니다.

예:

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

「사용자」(파일명)가 아닌 「사용자」(모델명)를 참조해 주세요.

.\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에서 set Timeout을 사용했을 때 이 오류가 해결되었습니다.

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);
import User from '..'

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

이 답변은 저에게 효과가 있습니다.단, 모델을 cote로 설정하는 것이 아니라 Import해야 합니다.

나도 같은 문제에 직면해 있었다.저의 문제 해결방법은 실제 수출한 모델과 다른 이름을 가진 ref 파라미터를 살펴보는 것이었고, 따라서 그러한 모델을 찾을 수 없었습니다.

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

한편, 실제로 수출한 것은:-

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

module.exports = Tasks

After rectifying the 수정 후Task as ~하듯이Tasks my problem was solved나의 문제는 해결되었다.

위의 라파엘 그릴리의 답변을 자세히 설명하자면,

정답:

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

데이터베이스에 더러운 데이터를 가지고 있지 않다는 것을 확인해야 합니다.또한 데이터베이스에 더러운 데이터가 없는지 확인해야 합니다. 왔습니다.userUser이로 인해 에러가 발생하여 추적하기가 매우 어렵습니다.

간단한 mongo 쿼리로 쉽게 수정할 수 있습니다.

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

제 경우, 어플리케이션에 모델이나 레퍼런스 모델을 포함하지 않았기 때문에 발생하는 문제입니다. 꼭 필요한 게 요.Post model ★★★★★★★★★★★★★★★★★」Comment model노드 어플리케이션으로 이동합니다.

새 모델을 생성할 때 모델 이름에서 참조하는 것과 동일한 이름을 사용하십시오.

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

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

글을 글 요.ref:"post".

나의 문제는 아래와 같이 해결되었다.

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

스키마를 Import할 때 파괴를 사용했기 때문에 실패했다는 것을 덧붙이고 싶습니다.

맞아요.

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

틀렸습니다

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

당신은 모델에 어떠한 가치도 주지 않고 있다.

저 같은 경우에는 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접속에 접속합니다.

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★삭제의 데이터를 mongoose하려고 할 때마다 mongoose.Mongoose Schema hasn't been registered for model에러가 표시되었습니다.리뷰 컬렉션을 삭제한 후 오류가 사라졌습니다.

저도 같은 문제에 직면해 있는데 module.exports를 삭제하여 해결했습니다.

module.module = mongoose.model "user", userSchema); // module.module.module.module.
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

언급URL : https://stackoverflow.com/questions/26818071/mongoose-schema-hasnt-been-registered-for-model

반응형