Я изучаю средний стек, и когда я пытаюсь запустить сервер, используя
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/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);
Post.js
, но вы никогда не «экспортировали» модель.Ответы:
Это не проблема с экспортом модели. Я была такая же проблема.
Настоящая проблема в том, что операторы require для моделей
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();
источник
routes/index.js
. Я понимаю, что такое ошибка отсутствия ссылки, но я подумал, что это не нужно создавать ... кто-нибудь это понял?Если кто-то не смог исправить это подходом правильного ответа (как я), попробуйте взглянуть на создание схемы. Я написал «ref» как «Пользователь», но правильным было «пользователь».
Неправильно:
createdBy: { type: Schema.Types.ObjectId, ref: 'User' }
Верный:
createdBy: { type: Schema.Types.ObjectId, ref: 'user' }
источник
ЕСЛИ ВЫ ИСПОЛЬЗУЕТЕ НЕСКОЛЬКО СОЕДИНЕНИЙ 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');
источник
findOne({}).populate({ path: 'created_by', model: User })
Customer.findOne({}).populate({ path: 'created_by', model: 'User' })
НО модели должны быть уже зарегистрированы в том же экземпляре мангуста.Я использовал следующий подход для решения проблемы
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
Я решил, что эта ошибка устранена при использовании 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);
источник
Проблема заключается в ссылках, всегда обязательно указывайте ссылки на любое имя, которое вы экспортируете из моделей.
// Модель
const Task = mongoose.model('**Tasks**', taskSchema);
// Ссылки
userSchema.virtual('tasks', { ref: '**Tasks**', localField: '_id', // field in current model foreignField: 'owner' // corresponding field in other model
});
источник
Я тоже столкнулся с той же проблемой. Решение моей проблемы заключалось в поиске параметра ref, имя которого отличалось от имени модели, которую я фактически экспортировал, и, следовательно, такой модели не было найдено.
userSchema.virtual('tasks', { ref: 'Task', localField: '_id', foreignField: 'owner' })
В то время как на самом деле я экспортировал:
const Tasks = mongoose.model('Tasks', taskSchema) module.exports = Tasks
После исправления,
Task
какTasks
моя проблема была решенаисточник
Разрабатывая ответ Рафаэля Грилли выше,
Верный:
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');
источник
Вы также должны убедиться, что в вашей базе данных нет грязных данных. В итоге я получил документ, содержащий версию модели, на которую указывает ссылка, в нижнем регистре (
user
вместоUser
). Это вызывает ошибку, и ее невероятно сложно отследить.Легко исправить с помощью быстрого запроса mongo:
db.model.updateMany({ approvedByKind: 'user' }, { $set: { approvedByKind: 'User' } })
источник
В моем случае эта проблема связана с тем, что я не включил модель или модель ref в приложение. Таким образом, вы должны требовать
Post model
иComment model
в своем приложении узла.источник
При создании новой модели используйте то же имя, что и в названии модели.
Например: если у меня есть модель мангуста, например:
var Post = mongoose.model("post",postSchema);
Затем я должен сослаться на сбор сообщений в письменной форме
ref:"post"
.источник
Я также столкнулся с той же проблемой, но я решил, удалив module.exports
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
источник
Моя проблема была решена с помощью нижеприведенного
adminModel.findById (req.params.id) .populate ({путь: "пользователи", модель: userModel // Имя коллекции пользователей})
источник
Просто хотел добавить, что для меня я использовал деструктуризацию при импорте схемы, которая приводила к сбою.
Верный
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
к подключению.источник