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

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, но ничего не было действительно полезно.

4b9b3361

Ответ 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