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

时间:2014-06-26 01:11:37

标签: javascript node.js mongodb mongoose

每当我启动应用程序时,我都会收到此错误:

- MissingSchema错误:尚未为模型“用户” -

注册架构

我正在从Simon Holmes的“Mongoose for Application Development”一书中学习一本教程。 我在第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:\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...

我很年轻,因为猫鼬和mongodb。 我已经阅读了勘误页面 检查我输入的内容是否与此处的内容完全相同。

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

非常感谢任何和所有的帮助。 谢谢。

2 个答案:

答案 0 :(得分:2)

你需要在某个地方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 :(得分:0)

该错误来自一行:

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

您需要为mongoose.model()方法提供Schema对象。第一个参数&#39; User&#39;只是告诉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。

尽管如此,如果您关心它,那么您的文件命名并不遵循惯例。

分离Schema和Model的优点是,当您需要多个复杂模式时,当您拥有大量模式插件时,您需要一个更简单的模型文件,而您需要所有这些。如果您只有如上所述的简单模式,我建议您使用单文件版本。