Подтвердить что ты не робот

Схема Mongoose не была зарегистрирована для модели

Я изучаю средний стек и когда я пытаюсь запустить сервер, используя

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

поскольку я вижу, что схема должна быть зарегистрирована для модели "Почта", но что может быть причиной того, что исключение будет выбрано?

Спасибо заранее.

Изменить: Здесь ошибка исключения

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

Ответ 1

Это не проблема с экспортом модели. Я была такая же проблема.

Реальная проблема заключается в том, что требуются утверждения для моделей

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

Ответ 2

Если кто-то не сможет исправить это с помощью правильного ответа (как и я), попробуйте посмотреть на создание схемы. Я написал "ref" как "Пользователь", но правильным был "пользователь".

Неправильно:

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

Правильно:

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

Ответ 3

ЕСЛИ ВЫ ИСПОЛЬЗУЕТЕ МНОЖЕСТВЕННЫЕ СОЕДИНЕНИЯ mongoDB


Остерегайтесь того, что при использовании .populate() вы ДОЛЖНЫ предоставить модель, поскольку мангуста будут только "находить" модели в одном и том же соединении. т.е. где:

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

Ответ 4

Я использовал следующий подход для решения проблемы

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.

Ответ 5

.\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

Эта ошибка была устранена при использовании setTimeout на server.js

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

Ответ 6

Эта ошибка также появляется, когда мы создаем неправильные ссылки (ref) между моделями мангустов.

В моем случае я имел в виду имя файла, а не название модели.

например:

const userModel = mongoose.model("пользователь", userSchema);

Мы должны ссылаться на "пользователя" (название модели) вместо "пользователя" (имя файла);

Ответ 7

Разрабатывая Рафаэля Грилли, ответьте выше,

Правильно:

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

Ответ 8

Вы также должны убедиться, что у вас нет грязных данных в вашей базе данных. Я закончил с документом, содержащим нижнюю версию ссылочной модели (user вместо user). Это вызывает ошибку и невероятно сложно отслеживать.

Легко исправить с помощью быстрого запроса mongo:

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

Ответ 9

В моем случае это проблема, потому что я не включил модель или модель ref в приложение. Таким образом, вы должны требовать Post model Comment model в вашем приложении узла.

Ответ 10

При создании новой модели используйте то же имя, которое вы указали в названии модели.

Например: если у меня есть модель мангуста, как:

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

Затем я должен сослаться на коллекцию сообщений через запись ref:"post".

Ответ 11

Здесь 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);