KGo*_*KGo 42 javascript mongoose node.js express
在我的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);
Run Code Online (Sandbox Code Playgroud)
在我router/index.js,我有:
var mongoose = require('mongoose');
var User = mongoose.model('User');
Run Code Online (Sandbox Code Playgroud)
抛出错误:
MissingSchemaError: Schema hasn't been registered for model "User".
Run Code Online (Sandbox Code Playgroud)
但是,如果user.js,我(在最后一行)
module.exports = mongoose.model('User', userSchema);
Run Code Online (Sandbox Code Playgroud)
在index.js我这样做var User = require('../models/User');,然后一切正常.
但它不应该,因为config/pass.js我正在做,var User = mongoose.model('User');而且它的工作完美无瑕.
该require('../models/User');语法不工作在Ubuntu,但在我的Mac.
我该怎么办?我如何解决它?我看了很多样本应用程序,包括MEAN,但没有什么是真正有用的.
小智 55
我在尝试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();
Run Code Online (Sandbox Code Playgroud)
希望答案会有所帮助!
ver*_*loc 37
发生错误是因为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');
Run Code Online (Sandbox Code Playgroud)
然而,这反映出最佳实践,这要求所有这些配置app.js文件应该在文件的开头发生.从madhums的示例项目中查看此示例
var models_path = __dirname + '/app/models'
fs.readdirSync(models_path).forEach(function (file) {
if (~file.indexOf('.js')) require(models_path + '/' + file)
})
Run Code Online (Sandbox Code Playgroud)
请注意,他在设置应用程序的路由器之前正在加载他的模型.至于Ubuntu vs Mac问题,我认为这是因为Ubuntu中的相对路径必须从一开始./.您只需将其更改为./../models/user.js适用于Mac的即可.
Nis*_*hah 13
我确实研究了很多,找到了一个解决方案,所以,我把这个解决方案分享给你,这样,没有人可以面对我犯的那个低级错误。
请记住,您只需添加ref与您提供的名称相同的名称model,因为它区分大小写( Product !== Product )。
const Product = new mongoose.model('Product', ProductSchema);
product: {
type: mongoose.Schema.ObjectId,
ref: 'Product', <-- Should be same as modelName
required: [true, 'Cart must belong to a product']
}
Run Code Online (Sandbox Code Playgroud)
小智 9
您的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模型的其他模块.
我在 ES6/Typescript 中也遇到过这个错误。即使我导入了模型,错误仍然存在。根据这里的文档
MongooseError.MissingSchemaError
当您尝试访问尚未注册的模型时抛出
import { model, Schema } from 'mongoose';
import Company from './CompanyModel';
const ProjectSchema = new Schema({
company: { type: Schema.Types.ObjectId, ref: "Company" }
});
export default model('Project', ProjectSchema);
Run Code Online (Sandbox Code Playgroud)
这些提示只是为了确保明确地使用该模型,因此更改ref:"Company"为ref:Company.modelName似乎可以修复它。
我希望这对你们中的一些人有帮助
在加载模型文件加载之前尝试获取模型时发生此问题
我在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');
Run Code Online (Sandbox Code Playgroud)
就我而言,它是由于大写/小写字母混淆而发生的。用户模型有这个:
const userSchema = new Schema({
// ...
});
module.exports = mongoose.model('User', userSchema);
Run Code Online (Sandbox Code Playgroud)
并且 Product 模型引用了 User 模型,但是小案例:
const productSchema = new Schema({
// ...
userId: {
type: Schema.Types.ObjectId,
ref: 'user', // This should exactly match the name of User model above!!!
required: true
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
54584 次 |
| 最近记录: |