web-dev-qa-db-ja.com

MissingSchemaError:モデル「ユーザー」にスキーマが登録されていません

_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 [〜#〜] を含む多数のサンプルアプリを見てきましたが、実際に役立つものはありませんでした。

39
Karan Goel

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();

答えが役立つことを願っています!

54
Ahei Cheng

このエラーは、models/user.jsがロードされるまでにrouter/index.jsが解釈されていないために発生します。これを解決する1つの方法は、以下を実行することです。

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対Macの問題に関しては、Ubuntuの相対パスは./で始まる必要があるためだと思います。 Macで動作する./../models/user.jsに変更する必要があります。

37
verybadalloc

Mongooseスキーマjsファイル内のすべてのコードは、他のファイルで使用する前に実行する必要があります。

たとえば、次のコードスニペットは、mongooseスキーマファイル/モジュールが実行されることを確認します。

fs.readdirSync(__ dirname + '/app/models').forEach(function(file){if(〜file.indexOf('。js '))require(__ dirname +'/app/models/'+ file);} );

またはスキーマファイルは、次の呼び出しにより手動で実行できます。

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

モデルがアプリケーションのどこでも使用される前。

上記が完了すると、mongooseモデルを使用する他のモジュールを要求/実行できます。

9

この問題は、モデルファイルを読み込む前にモデルを取得しようとしたときに発生しました

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');
6
Shaishab Roy

エクスプレスを使用する場合、よくある間違いの1つは、マングースの前にエクスプレスを要求することです。これは、「MissingSchemaError:モデル "User"のスキーマが登録されていません。」になります。エラー。

「require」の順序を修正することで簡単に修正できます(つまり、mongooseからexpress)

var mongoose = require('./config/mongoose'), 
    express = require('./config/express');
2
Wreeecks

mongoose-fixtureを使用していくつかのデフォルトデータをmongoコレクションにシードしようとすると、このエラーが発生しました。長い間困惑し、このスレッドと同様のスレッドに従って、デバッグを試みました。最終的に、この問題は私の場合のmongooseおよびmongoose-fixtureバージョンが原因であることが判明しました。

コードを変更しても問題が解決しない場合、またはmongoose-fixture(スキーマを登録することになっている)を正しく使用しようとしてこのエラーが発生する場合は、これを試してください。プロジェクトのnode_modulesディレクトリを削除し、npm cache cleanを実行してから、npm installを実行します。

それでも解決しない場合は、問題のあるアプリと動作するアプリの間でmongoose/mongoose-fixtureのバージョンを比較し、package.jsonのバージョンを変更して上記を繰り返してみてください。ステップ。これは私のために働いた。

1
Avik Ray

ES6/TypeScriptでもこのエラーが発生しました。モデルをインポートしても、エラーは引き続き発生します。ドキュメントによると here

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" into ref:Company.modelNameは修正されたようです。

それがあなたの一部を助けることを願っています

1
irzhy

このチュートリアルのベースコードに新しいモデルを追加しようとしたときに、この問題が発生しました MEANスタックのユーザー認証 。解決策は、 Ahei が述べたものに似ています。

具体的には、_/app_api/models/db.js_に必要な_app.js_の最後にrequire('path/to/your/model')行を追加する必要があります。開発を容易にするために、構造の一貫性を保つことをお勧めします。

0
peteroid

コレクションスキーマとそのモデルを正しく作成したように、私は別の間違いを犯していましたが、問題はスキーマモデル(ドキュメントの挿入、更新、読み取り、削除)を使用しなかったことです。

つまり、私はそのようなコレクションを作成しました:

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

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

しかし、どこでもPlayerSchemaモデルを使用または呼び出していないため、このエラーが発生します。

0
WasiF

私は最近、@ rajkumar-nagarajanと@verybadallocが提供する答えに似たソリューションに出会いました。

このアプローチは、n + 1の反復を避け、ファイルシステムからすべてのモデルを読み取るわけではないため、この方法の方が好きです。

app/models/index.js、各モデルファイルが必要です。

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

次に、/app.jsまたは/index.js(プロジェクトで使用するものはどれでも)、次の操作を実行できます。

require('./app/models');

私が欠落している部分(ここにあるすべてのヒントを感謝します)-各モデルを次のような名前で簡単に登録する方法:

mongoose.model('Model1')
0
theUtherSide
  • コードでモデルを要求する必要があります
  • Mongooseは、mongoose.modelを呼び出すまでモデルを定義したことを認識せず、モデルが必要な場合にのみ呼び出されます

例.

以下の例では、const Role = require("./role");を実行しないと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);
0
Vaibhav Bacchav