4

いくつかのモデルを定義し、グローバルな Mongoose 接続を作成するアプリケーションがあるとします ( mongoose.connect(...))。node_modulesアプリは、ディレクトリ内のモジュールによって定義されたいくつかのモデルにも依存しています。私が直面している問題は、アプリケーションと別のモジュールが同じグローバル接続オブジェクトを共有していないことです。

じゃ、いいよ。モジュールにモデルをエクスポートさせるのではなく、スキーマをエクスポートするだけで、メイン アプリケーションはそれを接続に登録できます。アプリには次のようなものがあります。

var SomeSchema = require('somemodule').SomeSchema;
mongoose.model('SomeModel', SomeSchema);

残念ながら、これも機能していません。モデルが登録されると、Mongoose は指定されたスキーマがmongoose.Schema( here ) のインスタンスであるかどうかを確認します。(別のモジュールで) が定義されると、モジュールのローカル依存関係ツリーから必要な場所でSomeSchemaスキーマが作成されます。アプリケーションがスキーマを登録するとき、アプリケーションの依存関係から必要なものを使用します。mongoose の 2 つのコピーは同じオブジェクトではないため、指定されたスキーマはインスタンスではなく、エラーがスローされます。new mongoose.Schema({ ... })mongoosemongoosemongoose.Schema

ここでお勧めはありますか?考えられる解決策の 1 つは、スキーマを受け入れてすべてのパス、メソッドなどを追加する「プラグイン」関数をモジュールに作成させることだと考えていました。メイン アプリは空のスキーマを作成し、プラグインを追加します。何かのようなもの:

var somePlugin = require('somemodule').somePlugin;
var SomeSchema = new mongoose.Schema();
SomeSchema.plugin(somePlugin);
mongoose.model('SomeModel', SomeSchema);

代替手段はありますか?

どうもありがとう。

4

1 に答える 1

0

この問題を回避するには、スキーマのプロトタイプをハッキングして正しいインスタンスを使用し、mongoose.SchemaMongoose の内部instanceofチェックにパスするようにしました。あなたの例では、次のような行を追加します。

var SomeSchema = require('somemodule').SomeSchema;
SomeSchema.__proto__ = mongoose.Schema.prototype;
mongoose.model('SomeModel', SomeSchema);

それは確かにコーシャではありませんが、私にとってはうまくいきます!

于 2013-08-12T21:07:52.877 に答える