Ошибка MissingSchema: схема не зарегистрирована для модели «Пользователь»

#javascript #node.js #mongodb #mongoose

#javascript #node.js #mongodb #мангуст

Вопрос:

Я продолжаю получать эту ошибку всякий раз, когда запускаю свое приложение:

—Ошибка MissingSchema: схема не зарегистрирована для модели «Пользователь» —

Я работаю над учебным пособием из книги Саймона Холмса «Мангуст для разработки приложений». Я в главе 5 «Взаимодействие с созданием данных»

Вот мой код:

app.js:

 var express = require('express')
, routes = require('./routes')
, user = require('./routes/user')
, project = require('./routes/project') 
, http = require('http')
, path = require('path');
  

db.js:

 //Creating the Application Schemas:
//====================================


//User Schema:
//===============
var userSchema = new mongoose.Schema({
name: String,
email: {type: String, unique:true},
createdOn: { type: date, default: date.now },
modifiedOn: Date,
LastLogin: Date  
});

//Build the User Model:
//===========================
mongoose.model( 'User', userSchema );
  

User.js:

 var mongoose = require("mongoose");
var User = mongoose.model( 'User' );
  

ОШИБКА, КОТОРАЯ ПРИВОДИТ:

 throw new mongoose.Error.MissingSchemaError(name);
  ^
MissingSchemaError: Schema hasn't been registered for model "User".
Use mongoose.model(name, schema) at Mongoose.Model             (C:UsersNewDesktopmongoose_pm_app
mongoosepmnode_modulesmongooselibindex.js.311.13)
at Object. <anonymous>    (C:UsersNewDesktopmongoose_pm_appmongoosepmroutesuser.js:2:21)
atModule._compile (module.js:456:26)
atObject.Module._extensions..js (module.js:474:10)
atModule.load (module.js:356:32)
at Function.Module._load (module.js:364:17)
at require (module.js:380:17)
at Object <anonymous> (C:UsersNewDesktopmongoose_pm_appmongoosepmapp.js:8:12)
at Module._compile (module.js:456:26) 
25 June 19:52:55 - [nodemon] app crashed waiting for file changes before starting...
  

Я молод для mongoose и mongodb.
Я просмотрел страницы с ошибками в книгах, чтобы
проверить, не ввел ли я что-нибудь неправильно, но все то же самое, что и здесь.

Я также попытался загрузить пример кода из PACKT, пример кода выглядит так же.

Мы будем признательны за любую помощь. Спасибо.

Комментарии:

1. 1 за хороший первый вопрос со всеми соответствующими данными. Добро пожаловать в StackOverflow!

2. @Zlatko Спасибо! Мне было интересно, достаточно ли я понятен и описателен. Спасибо за поддержку и предложение решения 🙂 Будет работать над этим. Манеры и уважение.

Ответ №1:

Вам нужно, чтобы require ваш db.js файл где-нибудь, так как в противном случае код в нем никогда не будет запущен, и схема никогда не будет зарегистрирована.

Кроме того, я бы рекомендовал вам определить свою пользовательскую схему внутри User.js и добавьте модель в экспорт, вот так:

User.js

 //User Schema:
//===============
var userSchema = new mongoose.Schema({
name: String,
email: {type: String, unique:true},
createdOn: { type: date, default: date.now },
modifiedOn: Date,
LastLogin: Date  
});

//Build the User Model:
//===========================
var User = mongoose.model( 'User', userSchema );

//Exports
//=======
exports = User;
  

Это позволяет вам использовать только require файл в другом месте, чтобы получить ссылку на пользовательскую модель (вместо того, чтобы извлекать ее через mongoose.model ). Например:

 var User = require('User');
// ...
var fred = new User({ ... });    // create a new user
fred.save(function (err, user) { ... });
  

Я не читал книгу, на которую вы ссылались, поэтому я не уверен, может ли быть веская причина для определения всех ваших схем в одном файле (в каком направлении, похоже, вы шли db.js ). Из того, что я видел, чаще всего используется одна схема / модель для каждого файла.

Комментарии:

1. Привет @Sergey K Основываясь на том, что есть в книге, она работает для автора, поэтому меня это тоже озадачило. Я буду внедрять исправления и уведомлять этот канал, если он исправлен. Большое спасибо за помощь.

Ответ №2:

Эта ошибка возникает из одной строки:

 var User = mongoose.model( 'User' );
  

Вам необходимо предоставить объект схемы методу mongoose.model(). Первый параметр, «User», просто сообщает mongoose, в каком имени будет называться коллекция. Второй определяет схему пользователя.

Так что либо сделайте что-то вроде того, что ответил Сергей, либо добавьте эти несколько изменений.

К вашему db.js , добавьте строку экспорта внизу:

 module.exports = userSchema;
  

Затем требуйте ее в User.js:

 var mongoose = require("mongoose");
var userSchema = require("./db.js");
var User = mongoose.model( 'User', userSchema );
module.exports = User;
  

В качестве альтернативы вы можете просто изменить последнюю строку в определении вашей схемы, экспортировав пользовательскую модель при ее создании:

 //Build the User Model:
//===========================
module.exports = mongoose.model( 'User', userSchema );
  

Тогда вам не нужно User.js вообще.

Хотя, тогда ваше именование файлов не соответствует соглашению, если вас это волнует.

Преимущества разделения схемы и модели заключаются в том, что вам требуется несколько сложных схем, когда у вас много плагинов схемы, поэтому вам нужен более простой файл модели, в котором вам все это требуется. Если у вас есть только простая схема, подобная приведенной выше, я рекомендую вам использовать версию с одним файлом.