MissingSchema错误:架构尚未注册模型“用户”

每当启动我的应用程序时,我总是收到这个错误:

–MissingSchema错误:架构尚未注册模型“用户” –

我正在从Simon Holmes的“Mongoose for Application Development”一书中学习一个教程。 我在第5章“与数据交互 – 创build”

这是我的代码:

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:\Users\New\Desktop\mongoose_pm_app\ mongoosepm\node_modules\mongoose\lib\index.js.311.13) at Object. <anonymous> (C:\Users\New\Desktop\mongoose_pm_app\mongoosepm\routes\user.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:\Users\New\Desktop\mongoose_pm_app\mongoosepm\app.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。 我已经通过书籍勘误表来检查我是否input了错误的内容,但是完全一样。

我也尝试从PACKT下载示例代码,示例代码看起来是一样的。

任何和所有的援助将非常感激。 谢谢。

您需要在您的db.js文件的某个位置,否则其中的代码将永远不会运行,并且架构将永远不会被注册。

另外,我build议你在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其他地方的文件来获得对User模型的引用(而不必通过mongoose.model来获取它)。 例如:

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

我没有读过你提到的那本书,所以我不确定是否有一个很好的理由在一个文件中定义所有的模式(这就是你看起来像使用db.js的方向) 。 从我所看到的情况来看,每个文件都有一个模式/模型更为常见。

这个错误来自一行:

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

你需要提供一个Schema对象给mongoose.model()方法。 第一个参数,“用户”,只是告诉mongoose会收集什么名称。 第二个定义用户模式。

因此,无论是像谢尔盖已经回答,或添加这些几个变化。

到你的db.js,在底部添加export行:

 module.exports = userSchema; 

然后在User.js中需要它:

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

或者,您可以通过在构build用户模型时导出用户模型来更改架构定义中的最后一行:

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

那么你根本就不需要User.js。

虽然,那么你的文件命名不符合惯例,如果你关心它。

分离模式和模型的好处是当你需要多个复杂的模式时,当你有很多模式插件,所以你想要一个简单的模型文件,你需要所有的。 如果你只有一个简单的模式,我build议你使用单一文件版本。