マングーススキーマはモデルに登録されていません


80

私は平均スタックを学習していて、を使用してサーバーを起動しようとすると

npm start

私はそれを言っている例外を受け取ります:

schema hasn't been registered for model 'Post'. Use mongoose.model(name, schema)

これが/models/Posts.js内の私のコードです

var mongoose = require('mongoose');

var PostSchema = new mongoose.Schema({
    title: String,
    link: String, 
    upvotes: { type: Number, default: 0 },
    comments: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Comment' }]
});

mongoose.model('Post', PostSchema);

スキーマはモデル「Post」に登録する必要があることがわかりますが、例外がスローされる原因は何でしょうか。

前もって感謝します。

編集:これが例外エラーです

/home/arash/Documents/projects/personal/flapper-news/node_modules/mongoose/lib/index.js:323
  throw new mongoose.Error.MissingSchemaError(name);
        ^
MissingSchemaError: Schema hasn't been registered for model "Post".
Use mongoose.model(name, schema)

マングースの初期化を使用したapp.jsコードは次のとおりです。

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/news');
require('./models/Posts');
require('./models/Comments');

行の前:

app.use('/', routes);

あなたはどこかで間違いを犯しています。上記のコードは有効です。おそらくPost.js、どこかで「必要」ですが、モデルを「エクスポート」したことはありません。
Neil Lunn

@NeilLunnわかりました。例外エラーを使用して質問を編集します。これで、質問から読み取ることができるのはそれだけです。多分他の人は私が見ることができないものを見ることができます
arash moeen 2014年

@うーん。後で「必要」な場所に「エクスポート」したことはありますか?それがここに欠けているコードだと思います。
Neil Lunn 2014年

@NeilLunnはapp.jsで意味しますか?app.jsコードも入れさせてください(マングースの部分のみ)
arash moeen 2014年

そのIDがコードの場合、モデルを「エクスポート」することはありません。ねえ今3回。あなたは今までにこれを手に入れるべきです。
Neil Lunn 2014年

回答:


142

モデルのエクスポートの問題ではありません。私も同じ問題を抱えていました。

本当の問題は、モデルのステートメントが必要なことです

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/news');
require('./models/Posts');
require('./models/Comments');

ルートの依存関係を下回っていました。mongoDBの依存関係をルートの依存関係の上に移動するだけです。これはどのように見えるべきかです:

// MongoDB
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/news');
require('./models/Posts');
require('./models/Comments');

var routes = require('./routes/index');
var users = require('./routes/users');

var app = express();

@Markコメントvarmongoose = require( "mongoose"); コメントと投稿も同様に、var Posts = require( "Posts");を追加します。router.getとrouter.postの内部に直接、コメントについても同様
Dhyey 2016

これでスキーマエラーが解決したようですが、に「ルーターが定義されていません」というエラーがありroutes/index.jsます。欠落している参照エラーが何であるかは理解していますが、これをインスタンス化する必要はないと思いました。誰かがこれを取得しますか?
gin93r 2016

@maiamachine Thinksterチュートリアルを機能させたことがありますか?私はそれを約1週間取り組んできましたが、至る所でランダムな問題に悩まされていました。jsFiddleなどに動作するコードを投稿できる可能性はありますか?
Travis Heeter 2017年

@ user8264:動的に作成されたスキーマモデルの概念を実装するにはどうすればよいですか?
パパS20年

48

誰かが(私のように)正解のアプローチでそれを修正できない場合は、スキーマの作成を調べてみてください。'ref'を 'User'と書きましたが、正しいのは 'user'でした。

違う:

createdBy: {
    type: Schema.Types.ObjectId,
    ref: 'User'
}

正しい:

createdBy: {
    type: Schema.Types.ObjectId,
    ref: 'user'
}

2
私の問題を修正しました:)
midhunk19年

32

複数のmongoDB接続を使用する場合


.populate()を使用する場合、mongooseは同じ接続上のモデルのみを「検索」するため、モデルを指定する必要があることに注意してください。つまり、ここで:

var db1 = mongoose.createConnection('mongodb://localhost:27017/gh3639');
var db2 = mongoose.createConnection('mongodb://localhost:27017/gh3639_2');
var userSchema = mongoose.Schema({
  "name": String,
  "email": String
});

var customerSchema = mongoose.Schema({
  "name" : { type: String },
  "email" : [ String ],
  "created_by" : { type: mongoose.Schema.Types.ObjectId, ref: 'users' },
});

var User = db1.model('users', userSchema);
var Customer = db2.model('customers', customerSchema);

正しい:

Customer.findOne({}).populate('created_by', 'name email', User)

または

Customer.findOne({}).populate({ path: 'created_by', model: User })

不正解(「スキーマがモデルに登録されていません」というエラーが発生します):

Customer.findOne({}).populate('created_by');

2
この解決策は私の問題を修正しました!findOne({}).populate({ path: 'created_by', model: User })
リカルドシルバ

私のためにそれをしました。おかげで芽
ALEKS

@ user3616725:動的に作成されたスキーマモデルのコンセプトを実装するにはどうすればよいですか?
パパS20年

1
@PappaSモデル名を知っている限り、モデルインスタンスではなく、モデル名をパスできます。ただし、モデルCustomer.findOne({}).populate({ path: 'created_by', model: 'User' })は同じマングースインスタンスにすでに登録されている必要があります。
user36167 2520年

13

私は問題を解決するために次のアプローチを使用しました

const mongoose = require('mongoose');
const Comment = require('./comment');

const PostSchema = new mongoose.Schema({
            title: String,
            link: String, 
            upvotes: { type: Number, default: 0 },
            comments: [{ type: mongoose.Schema.Types.ObjectId, ref: Comment }]
        });
mongoose.model('Post', PostSchema);

見てください、ここにrefstring型の値がありません、今それはCommentスキーマを参照しています。


1
たくさんありますが、それが私にとって本当に唯一の方法でした-何十ものバリアントを試した後-それを簡単に機能させるために。
ステファン・ヴァルター

動的に作成されたスキーマモデルの概念を実装するにはどうすればよいですか?
パパS20年

4

このエラーは、マングースモデル間に間違った参照(ref)を作成したときにも発生します。

私の場合、モデル名ではなくファイル名を参照していました。

例えば:

const userModel = mongoose.model("user", userSchema);

'User'(ファイル名)ではなく 'user'(モデル名)を参照する必要があります。


モデルが別のマングースモデルを参照しているときに、同じ問題が発生しました。あなたの答えに触発されて、私の現在のMongoDBコレクションが参照している正しいMongoDBコレクション名に変更してください。問題が解決しました。どうもありがとうございました。
GoodApple

3

これがhttps://mongoosejs.com/docs/populate.html#cross-db-populateです

モデルを3番目の引数として渡す必要があると書かれています。

例えば

//Require User Model
const UserModel = require('./../models/User');
//Require Post Model
const PostModel = require('./../models/Post');
const posts = await PostModel.find({})
            .select('-__v')
            .populate({
              path: 'user',
              select: 'name -_id',
              model: UserModel
            });
//or 
const posts = await PostModel.find({})
            .select('-__v')
            .populate('user','name', UserModel);


2
.\nodeapp\node_modules\mongoose\lib\index.js:452
      throw new mongoose.Error.MissingSchemaError(name);
      ^
MissingSchemaError: Schema hasn't been registered for model "users".
Use mongoose.model(name, schema)
    at new MissingSchemaError

server.jsでsetTimeoutを使用すると、このエラーが解決されました

mongoose.connect(env.get('mongodb.uri'), { useNewUrlParser: true })
  .then(() => logger.info("MongoDB successfully connected"))
  .catch(err => logger.error(err));
app.use(passport.initialize());
setTimeout(function() {
  require("./src/utils/passport")(passport);
}, 3000);

1

問題は参照にあります。モデルからエクスポートする名前を参照するようにしてください。

//モデル

const Task = mongoose.model('**Tasks**', taskSchema);

//参照

userSchema.virtual('tasks', {
ref: '**Tasks**',
localField: '_id', // field in current model
foreignField: 'owner' // corresponding field in other model

});


1

私も同じ問題に直面していました。私の問題の解決策は、実際にエクスポートしているモデルとは異なる名前のrefパラメーターを調べることでした。そのため、そのようなモデルは見つかりませんでした。

userSchema.virtual('tasks', {
    ref: 'Task',
    localField: '_id',
    foreignField: 'owner'
})
  

私が実際にエクスポートしたのは:-

const Tasks = mongoose.model('Tasks', taskSchema)

module.exports = Tasks

私の問題が解決さTaskれたTasksので修正した後


0

上記のRafaelGrilliの答えを詳しく説明します。

正しい:

var HouseSchema = new mongoose.Schema({
  date: {type: Date, default:Date.now},
  floorplan: String,
  name:String,
  house_id:String,
  addressLine1:String,
  addressLine2:String,
  city:String,
  postCode:String,
  _locks:[{type: Schema.Types.ObjectId, ref: 'xxx'}] //ref here refers to the first parameter passed into mongoose.model()
});
var House = mongoose.model('xxx', HouseSchema, 'houseschemas');

0

また、データベースにダーティデータがないことを確認する必要があります。参照されたモデルの小文字バージョンを(のuser代わりにUser)含むドキュメントになりました。これによりエラーが発生し、追跡が非常に困難になります。

簡単なmongoクエリで簡単に修正できます:

db.model.updateMany({ approvedByKind: 'user' }, { $set: { approvedByKind: 'User' } })

0

私の場合、この問題は、モデルまたは参照モデルをアプリケーションに含めていないためです。したがって、ノードアプリケーションで必要にPost modelなりComment modelます。


0

新しいモデルを作成するときに、モデル名で参照するのと同じ名前を参照してください。

例:次のようなマングースモデルがある場合:

var Post = mongoose.model("post",postSchema);

次に、書き込みを介して投稿コレクションを参照する必要がありますref:"post"


0

私も同じ問題に直面していますが、module.exportsを削除することで解決しました

module.exports = mongoose.model( 'user'、userSchema); // module.exports削除し、次のように使用します:: mongoose.model
( 'user'、userSchema);

const mongoose = require('mongoose');
const ObjectId = require('mongoose').ObjectId;

var userSchema = new mongoose.Schema({
    Password: { type: String },  
    Email: { type: String, required: 'This field is required.', unique:true },  
    songs: [{ type: ObjectId, ref: 'Songs'}]
});

// Custom validation for email
userSchema.path('Email').validate((val) => {
    emailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    return emailRegex.test(val);
}, 'Invalid e-mail.');

// module.exports = mongoose.model('user', userSchema);  // remove 'module.exports ='
mongoose.model('user', userSchema); // resolved issue

0

私の問題は以下を使用して解決されました

adminModel.findById(req.params.id).populate({path: "users"、model:userModel //ユーザーコレクション名})


0

それを追加したかったのですが、スキーマをインポートするときに破壊を使用していたため、スキーマが失敗していました。

正しい

var intakeSchema = require('../config/models/intake')

正しくない

var { intakeSchema } = require('../config/models/intake')

0

モデルに値を与えていません

私の場合、MongoDB接続を確立するときに更新しなかったモデルを使用していました。

だから、私は次のようなものを持っていました

const Device = require('../../models/device')
// make use of Device

この接続で

conn = await mongo.createConnection(conn,
      [JobApplication, Job, User])

修正

conn接続を開始するときにモデルを追加する必要があります

conn = await mongo.createConnection(conn,
      [JobApplication, Job, User, Device])

Device接続に追加したことに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.