6

免責事項: 私はマングース/ノードを初めて使用するので、基本的なことを誤解している場合はご容赦ください。はい、このトピックに関する投稿をすでにいくつか見つけましたが、私のニーズに合わせることができませんでした。

メインプロジェクトを複数の個別のプロジェクトに構造化しました。1 つの分離は、「app-core」プロジェクトです。このプロジェクトには、コア モデルとモジュールが含まれ、他の各プロジェクトによって注入されます (app-core は、各プロジェクトの package.json ファイルで依存関係として構成されます)。

app-core 内の (簡略化された) モデルは現在、次のようになっています。

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

var IndustrySchema = new Schema({
name: {
    type: String,
    required: true
}
}); 

module.exports = mongoose.model('Industry', IndustrySchema);

wep-app には、次のようにこのモデルが含まれています。

var Industry = require('app-core/models/Industry');

次のように MongoDB 接続を作成します。

var DB_URL = 'mongodb://localhost/hellowins';
var mongoose = require('mongoose');
var mongooseClient = mongoose.connect(DB_URL);
mongooseClient.connection.on('connected',function () {
  console.log("MongoDB is connected");
});

モデルが app-web プロジェクトで定義された mongo 接続を使用せず、app-core で構成された接続を考慮するという問題があります

カプセル化と責任の設計により、コアが可能な各アプリ(コアアプリを含む場合がある)の接続を定義することは絶対に望んでいません。したがって、どういうわけか、コアでのみスキームを指定する必要があります。

モデル自体 (/app-core/models/Industry) を必要とせず、代わりにマングース モデルを使用するべきであることを既に読みました。

var Industry = mongoose.model("Industry");

しかし、その後、エラーが発生します

MissingSchemaError: Schema hasn't been registered for model "Test"

これを修正するには、最初のリンク (投稿の上部) でアドバイスされているように、モデルを手動で登録する必要があります。しかし、アプリケーションが新しいモデルを使用するたびにこれを拡張する必要があるため、このアプローチは好きではありません。

さらに、コアアプリでもmongo接続が必要です-少なくともモカテストを実行します。

そのため、この場合のアーキテクチャの構築方法について少し混乱しています。

更新 #1

私は今、1つの実用的な解決策を見つけました。しかし、残念ながら、これは私の要件に完全には適合しません。フック (つまり、TestSchema.pre('save'..)) によってモデルを拡張するのはかなり難しい (醜い) からです。

モデル (アプリコア)

exports.model = {
    name: {
        type: String,
        required: true
    }
};

models.js (app-web、起動時に 1 回実行)

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var models = ['Test']; // add many
exports.initialize = function() {
    var l = models.length;
    for (var i = 0; i < l; i++) {
        var model = require('hw-core/models/' + models[i]);
        var ModelSchema = new Schema(model.model);
        module.exports = mongoose.model(models[i], ModelSchema);
}

};

app.js (ウェブアプリ)

require('./conf/app_models.js').initialize();

次に、次のようにモデルを取得できます

var mongoose = require('mongoose');
var TestModel = mongoose.model("Test");
var Test = new TestModel();
4

1 に答える 1

1

app-core モジュールから mongoose インスタンスをエクスポートして、後で Web アプリで使用してデータベースに接続してみませんか。

app-core index.js

var mongoose = require('mongoose');
module.exports = {
    mongooseInstance: mongoose };

web-app index.js

var core = require('app-core'),
    mongoose = core.mongooseInstance,

mongooseClient = mongoose.connect(DB_URL);
// and so on

index.js からのコードの後に​​初期化されるコントローラーでモデルが必要な限り、これは機能する可能性があります。私の回答がお役に立てば幸いです。

于 2015-04-29T12:14:43.523 に答える