在我的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,但没有什么是真正有用的.
我在尝试MEAN教程时遇到了同样的问题.
在做了一点研究后,我发现在app.js中,如果我在var routes = require("./ routes/index")之前放置require("./ models/User"),那么它就可以了.
像这样:
mongoose.connect("mongodb://localhost/news"); require("./models/Posts"); require("./models/Comments"); var routes = require('./routes/index'); var users = require('./routes/users'); var app = express();
希望答案会有所帮助!
发生错误是因为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的即可.
您的mongoose模式js文件中的所有代码应该在其他文件中使用之前运行.
例如,以下代码段确保执行mongoose模式文件/模块.
fs.readdirSync(__ dirname +'/ app/model').forEach(functions(file){if(~file.indexOf('.js'))require(__ dirname +'/ app/models /'+ file);} );
或者可以通过调用手动执行模式文件
var User = require('./ app/models/user.js')
在模型在应用程序的任何地方使用之前.
完成上述操作后,可以要求/执行使用mongoose模型的其他模块.
在加载模型文件加载之前尝试获取模型时发生此问题
我在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');