MissingSchemaError:尚未为模型"用户"注册架构

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模型的其他模块.


irz*_*zhy 9

我在 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似乎可以修复它。

我希望这对你们中的一些人有帮助


Sha*_*Roy 6

在加载模型文件加载之前尝试获取模型时发生此问题

我在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)


Ati*_*nar 5

就我而言,它是由于大写/小写字母混淆而发生的。用户模型有这个:

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)