#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 вообще.
Хотя, тогда ваше именование файлов не соответствует соглашению, если вас это волнует.
Преимущества разделения схемы и модели заключаются в том, что вам требуется несколько сложных схем, когда у вас много плагинов схемы, поэтому вам нужен более простой файл модели, в котором вам все это требуется. Если у вас есть только простая схема, подобная приведенной выше, я рекомендую вам использовать версию с одним файлом.