MissingSchemaError: схема не была зарегистрирована для модели "Пользователь"
В моем models/user.js
файле:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var userSchema = new Schema({
(define schema)
});
...
(save user)
...
(check password)
...
mongoose.model('User', userSchema);
И в моем router/index.js
у меня есть:
var mongoose = require('mongoose');
var User = mongoose.model('User');
который выдает ошибку:
MissingSchemaError: Schema hasn't been registered for model "User".
Если, однако, в user.js
, я делаю (в последней строке)
module.exports = mongoose.model('User', userSchema);
и в index.js
я делаю var User = require('../models/User');
, тогда все работает.
Но это не должно, потому что в config/pass.js
я делаю var User = mongoose.model('User');
и работает безупречно.
Синтаксис require('../models/User');
не работает на Ubuntu, но находится на моем Mac.
Что мне делать? Как это исправить? Я просмотрел несколько примеров приложений, включая MEAN, но ничего не было действительно полезно.
Ответы
Ответ 1
У меня такая же проблема, когда я пытаюсь использовать учебник MEAN.
После небольшого исследования я обнаружил, что в app.js, если я ставил require ( "./models/User" ) перед var routes = require ( "./routes/index" ), тогда он работает.
Вот так:
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
Ошибка возникает из-за того, что models/user.js
не был интерпретирован к моменту загрузки router/index.js
. Один из способов решения этой проблемы - сделать следующее:
var mongoose = require('mongoose');
//Load all your models
var User = require('./../models/user.js');
//Now, this call won't fail because User has been added as a schema.
mongoose.model('User');
Это, однако, оказывается против лучших практик, которые диктуют, что все эти файлы конфигурации должны произойти в начале вашего файла app.js
. Посмотрите на этот пример из пример проекта madhums
var models_path = __dirname + '/app/models'
fs.readdirSync(models_path).forEach(function (file) {
if (~file.indexOf('.js')) require(models_path + '/' + file)
})
Обратите внимание, что он загружает свои модели перед настройкой маршрутизатора приложений.
Что касается проблемы с Ubuntu vs Mac, я считаю, что это связано с тем, что относительный путь в Ubuntu должен начинаться с ./
. Вам просто нужно изменить его на ./../models/user.js
, который работает на Mac.
Ответ 3
Весь код в ваших файлах ja файлов схемы mongoose должен быть запущен до того, как он будет использоваться в других файлах.
Например, следующий фрагмент кода гарантирует, что файлы/модули схемы мангуста выполняются.
fs.readdirSync(__ dirname + '/app/models').forEach(функция (файл) { if (~ file.indexOf('. js')) требуется (__ dirname + '/app/models/' + file); });
или файлы схемы можно выполнить вручную, вызвав
var User = require ('./app/models/user.js')
прежде чем модели будут использоваться в любом месте приложения.
Как только это будет сделано, могут потребоваться и выполнить другие модули, которые используют модели mongoose.
Ответ 4
Эта проблема возникла при попытке получить модель перед загрузкой загрузки файла модели.
Я решил такую же проблему в проекте mean.io
В контроллере:
'use strict';
require('../models/settingsModel'); // load settingsModel.js file before get mongoose.model('Settings')
var mongoose = require('mongoose'),
Settings = mongoose.model('Settings'),
Q = require('q');
Ответ 5
При использовании выражения, одной из распространенных ошибок является требование экспресс перед мангуста. В результате "MissingSchemaError: схема не была зарегистрирована для модели" Пользователь "". ошибка.
Вы можете легко исправить это, исправив "требуемый" порядок (например, mongoose затем выразить)
var mongoose = require('./config/mongoose'),
express = require('./config/express');
Ответ 6
Я получил эту ошибку, пытаясь использовать mongoose-fixture
, чтобы засеять некоторые данные по умолчанию в коллекцию монго. Был озадачен надолго, после этого и подобных нитей для помощи, пытаясь отлаживать. В конечном итоге проблема оказалась из-за версий mongoose
и mongoose-fixture
в моем случае.
Если никакой код не помогает, или если вы получите эту ошибку при попытке правильно использовать mongoose-fixture
(который должен зарегистрировать ваши схемы для вас), попробуйте это. Удалите директорию node_modules
вашего проекта, запустите npm cache clean
, а затем npm install
.
Если это даже не помогает, попробуйте сравнить версии mongoose
/mongoose-fixture
между проблемным приложением и тем, что работает, и попробуйте изменить версию в package.json
и повторите вышеуказанные шаги. Это сработало для меня.
Ответ 7
Я также испытал эту ошибку с ES6/Typescript. Даже я импортировал модель, ошибка все еще сохранялась. Согласно документам здесь
MongooseError.MissingSchemaError
Выдается при попытке доступа к модели, которая еще не была зарегистрирована
import { model, Schema } from 'mongoose';
import Company from './CompanyModel';
const ProjectSchema = new Schema({
company: { type: Schema.Types.ObjectId, ref: "Company" }
});
export default model('Project', ProjectSchema);
Советы ref:Company.modelName
в том, чтобы просто использовать модель явно, поэтому изменение ref:"Company"
на ref:Company.modelName
казалось исправленным.
Я надеюсь, что это поможет некоторым из вас
Ответ 8
Я столкнулся с этой проблемой, когда попытался добавить новую модель в базовый код этого учебника User Auth on MEAN stack. Решение похоже на то, что упомянуто Ahei.
В частности, мне нужно добавить строку require('path/to/your/model')
в конце /app_api/models/db.js
, которая требуется в app.js
. Лучше сохранить согласованность структуры для удобства развития.
Ответ 9
Недавно я наткнулся на решение, похожее на ответы, предоставленные @rajkumar-nagarajan и @verybadalloc.
Мне больше нравится этот подход, потому что он избегает итерации n + 1 и не читает все модели из файловой системы.
В app/models/index.js
требуется каждый файл модели:
require('./model1');
require('./model2');
require('./model3');
Затем в /app.js
или /index.js
(в зависимости от того, что использует ваш проект) вы теперь можете просто сделать:
require('./app/models');
Часть, которую я пропускаю (любые советы приветствуются здесь) --how, чтобы легко зарегистрировать каждую модель по имени, например:
mongoose.model('Model1')
Ответ 10
Это также может произойти, если требуемая схема или модель не могут быть найдены.....
Ответ 11
Я совершил другую ошибку, как будто правильно создал схему коллекции и ее модель, но проблема заключалась в том, что я не использовал модель схемы (для вставки, обновления, чтения и удаления документа).
я создал коллекцию примерно так:
const playerSchema = new Schema({
bowling: {
style: String,
arm: String,
}
})
export const PlayerSchema = model('Player', playerSchema)
но где-то не использовал и не вызывал модель PlayerSchema
, поэтому получаю эту ошибку
Ответ 12
- Вам нужно будет указать свою модель в своем коде
- Mongoose не узнает, что вы определили модель, пока не вызовете mongoose.model, и она вызывается только тогда, когда вам требуется модель
Ex.
В приведенном ниже примере вы получите MissingSchemaError: Schema hasn't been registered for model 'Role'
, если не сделаете const Role = require("./role");
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const Role = require("./role");
const userSchema = new Schema(
{
role: { type: Schema.Types.ObjectId, ref: "Role", required: false },
username: { type: String, required: true, trim: true },
password: { type: String, required: true, trim: true },
email: { type: String, required: true, trim: true }
},
{ timestamps: true }
);
module.exports = mongoose.model("User", userSchema);
Ответ 13
В моем случае проблема, которую я использовал (Проблема):
module.exports = mongoose.model('Note', NoteSchema);
...
User.find().populate('notes')
Чтобы это исправить, я должен был изменить "Примечание" на "Примечание"! (Исправить):
module.exports = mongoose.model('Note', NoteSchema);
Ответ 14
Если вы используете стек Mean.js, запустите тест с помощью:
grunt test
И не с
mocha