javascript-MissingSchemaError:尚未为模型“ User”注册架构

在我的require('../models/User');文件中:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var userSchema = new Schema({
    (define schema)
});
...
(save user)
...
(check password)
...
mongoose.model('User', userSchema);

在我的require('../models/User');中,我有:

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

引发错误:

MissingSchemaError: Schema hasn't been registered for model "User".

但是,如果在require('../models/User');中,我做了(在最后一行中)

module.exports = mongoose.model('User', userSchema);

然后在require('../models/User');中执行var User = mongoose.model('User');,则一切正常。

但这不应该,因为在require('../models/User');中,我正在执行var User = mongoose.model('User');,它可以完美地工作。

require('../models/User');语法在Ubuntu上不起作用,但在我的Mac上可用。

我该怎么办? 我如何解决它? 我查看了无数示例应用程序,包括MEAN,但没有任何真正的帮助。

Karan Goel asked 2020-08-09T07:18:22Z
12个解决方案
55 votes

我在尝试MEAN教程时遇到了同样的问题。

经过一些研究,我发现在app.js中,如果我在var route = 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();

希望答案会有所帮助!

Ahei Cheng answered 2020-08-09T07:18:41Z
37 votes

发生错误是因为在加载./../models/user.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');

但是,事实证明这与最佳实践相反,这表明所有这些配置工作都应在./文件的开头进行。 从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上运行。

verybadalloc answered 2020-08-09T07:19:10Z
9 votes

猫鼬模式js文件中的所有代码都应已运行,然后才能在其他文件中使用。

例如,以下代码段确保执行猫鼬模式文件/模块。

fs.readdirSync(__ dirname +'/app/models').forEach(function(file){ 如果(〜file.indexOf('。js'))需要(__dirname +'/ app / models /'+文件); });

或模式文件可以通过调用手动执行

var User = require('./ app / models / user.js')

在应用程序中的任何地方使用模型之前。

完成上述操作后,就可以要求/执行使用猫鼬模型的其他模块。

Rajkumar Nagarajan answered 2020-08-09T07:19:57Z
6 votes

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

我在我的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');
Shaishab Roy answered 2020-08-09T07:20:26Z
2 votes

在使用快递时,常见的错误之一是在猫鼬之前要求快递。 结果为“ MissingSchemaError:尚未为模型“ User”注册架构。” 错误。

您可以通过更正“要求”顺序(即猫鼬然后表达)来轻松修复它

var mongoose = require('./config/mongoose'), 
    express = require('./config/express');
Wreeecks answered 2020-08-09T07:20:51Z
1 votes

尝试使用mongoose-fixture将一些默认数据植入mongo集合时,出现此错误。 困扰了很长一段时间,跟随这个和类似的线程寻求帮助,尝试进行调试。 最终,该问题最终归因于我的案例中的mongoosemongoose-fixture版本。

如果没有代码更改帮助,或者在尝试正确使用mongoose-fixture(应该为您注册架构)时遇到此错误,请尝试此操作。 删除项目的mongoose目录,运行mongoose-fixture,然后运行package.json

如果仍然无法解决问题,请尝试在有问题的应用程序和可以正常运行的应用程序之间比较mongoose/mongoose-fixture的版本,然后尝试更改package.json中的版本,然后重复上述步骤。 这对我有用。

Avik Ray answered 2020-08-09T07:21:21Z
1 votes

我还遇到了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);

提示只是为了确保明确使用该模型,因此将ref:"Company"更改为ref:Company.modelName似乎可以解决问题。

希望对您有所帮助

irzhy answered 2020-08-09T07:21:58Z
0 votes

当尝试在MEAN堆栈上的本教程User Auth的基本代码上添加新模型时遇到此问题。 解决方案就像Ahei提到的那样。

具体来说,我需要在/app_api/models/db.js的末尾添加/app_api/models/db.js的行,这是app.js所要求的。最好保持结构的一致性,以便于开发。

peteroid answered 2020-08-09T07:22:24Z
0 votes

我最近遇到了一个类似于@ rajkumar-nagarajan和@verybadalloc提供的答案的解决方案。

我更喜欢这种方法,因为它避免了n + 1迭代,并且不会从文件系统中读取所有模型。

/app.js中,要求每个模型文件:

require('./model1');
require('./model2');
require('./model3');

然后,在/app.js/index.js(无论您的项目使用哪个)中,您现在都可以简单地执行以下操作:

require('./app/models');

我缺少的部分(在此感谢任何提示)-如何通过名称轻松注册每个模型,例如:

mongoose.model('Model1')
theUtherSide answered 2020-08-09T07:23:02Z
0 votes

我犯了一个不同的错误,就像我正确创建了收集模式及其模型一样,但是问题是我没有使用模式模型(用于插入,更新,读取和删除文档)。

即我创建了类似的集合:

const playerSchema = new Schema({
    bowling: {
        style: String,
        arm: String,
    }
})

export const PlayerSchema = model('Player', playerSchema)

但是没有在某处使用或调用PlayerSchema模型,这就是为什么会出现此错误的原因

WasiF answered 2020-08-09T07:23:38Z
0 votes
  • 您需要在代码中要求您的模型
  • 在调用mongoose.model之前,Mongoose不会意识到您已经定义了模型,并且仅在需要模型时才调用

例如

在下面的示例中,如果您不这样做,则会得到MissingSchemaError: Schema hasn't been registered for model “Role”

const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const Role = require("./role");
const userSchema = new Schema(
  {
    role: { type: Schema.Types.ObjectId, ref: "Role", required: false },
    username: { type: String, required: true, trim: true },
    password: { type: String, required: true, trim: true },
    email: { type: String, required: true, trim: true }
  },
  { timestamps: true }
);

module.exports = mongoose.model("User", userSchema);
Vaibhav Bacchav answered 2020-08-09T07:24:11Z
-9 votes

如果使用的是Mean.js堆栈,请使用以下命令运行测试:

grunt test

而不是

mocha
Maçois answered 2020-08-09T07:24:35Z
translate from https://stackoverflow.com:/questions/20832126/missingschemaerror-schema-hasnt-been-registered-for-model-user