3

Express.js は、アプリの構造を決定する際に開発者に任せることがほとんどであることを知っます。私がやっていることが最善の方法です。

アプリでRedisを広範囲に使用していて、クエリを実行するためにredisクライアントを必要とする複数の「モデル」があるとします。次のように、メインのapp.jsでredisクライアントを初期化する方がよいでしょうか:

var db = redis.createClient();
var models = require('./models')(db);
var routes = require('./controllers')(models);

それとも、各モデルで redis を初期化してから、各コントローラーに目的のモデルを要求させる方がよいでしょうか?

後者のアプローチは、私が使用しているものであり、DRY ではありません。しかし、モデルのインスタンスを渡すのが最善の方法ですか? ここで複数のモデル/コントローラーをロードしていることに注意してください - 各モデルに redis クライアントを正しく渡すためにセットアップを変更する方法がわかりません。

//currently in models/index.js

exports.home = require('./home.js');
exports.users = require('./user.js');

TL;DR、私の質問は次のとおりです。

  1. MVCパターンアプリでredisクライアントを初期化するのに最適な場所は?
  2. このredisクライアントインスタンスを複数のモデルに渡す方法require('./models')(db)

アップデート:

代わりに、モデル/コントローラーのオブジェクトを返すためindex.jsに使用する別のアプローチを試しました。module.exports

module.exports = function(models){

  var routes = {};

  routes.online = require('./home.js')(models);
  routes.users = require('./user.js')(models);

  return routes;

};

より良いアイデアのように思えますか?

4

1 に答える 1

3

SQL ORM であるPatioを使用して最近どのようにプロジェクトを実装したかを共有できれば、おそらく役に立つでしょう。もう少し背景: 私が使用していた MVC フレームワークはLocomotiveでしたが、それは絶対に必要条件ではありません (Locomotive には ORM がなく、Express と同様に、モデルとデータベースの処理方法の実装は開発者に任せられます)。

Locomotive には「initializers」と呼ばれる構造があり、これはアプリの起動時にロードされる単なる JS ファイルです。彼らが何をするかは開発者次第です。私のプロジェクトでは、1 つの初期化子がデータベースを構成しました。

イニシャライザは、実際のデータベース接続を確立し、modelディレクトリ内のすべての JS ファイルのロードも処理しました。擬似コード:

registry = require('model_registry'); // see below
db       = createDatabaseConnection();
files    = fs.readDirSync(MODEL_DIRECTORY);
for each file in files:
  if filename doesn't end with '.js':
    continue
  mod = require(path.join(MODEL_DIRECTORY, filename));
  var model = mod(db);
  registry.registerModel(model);

モデルは次のようになります。

// models/mymodel.js
module.exports = function(db ) {
  var model = function(...) { /* model class */ };
  model.modelName = 'MyModel'; // used by registry, see below
  return model;
};

モデル レジストリは、すべてのモデルを保持するための非常に単純なモジュールです。

module.exports = {
  registerModel : function(model) {
    if (! model.hasOwnProperty('modelName'))
      throw Error('[model registry] models require a modelName property');
    this[model.modelName] = model;
  }
};

モデル レジストリはモデル クラスを に保存するため、モデルthismodule.exportsアクセスする必要がある他のファイルからモデル クラスをインポートできます。

// mycontroller.js
var MyModel = require('model_registry').MyModel;
var instance = new MyModel(...);

免責事項:これは私にとってはうまくいきました、YMMV。また、上記のコード サンプルでは非同期要件やエラー処理が考慮されていないため、私の場合の実際の実装はもう少し複雑でした。

于 2013-03-29T14:06:47.930 に答える