4

だから私はノードにベンダー固有のファイルをたくさん書いていますが、それらはすべて同様のコントローラーパターンを持っているので、それらを切り取って共通ファイルに入れるのは理にかなっています。

ここで私の共通コントローラーファイルを見ることができます: https://gist.github.com/081a04073656bf28f46b

複数のモジュールでそれらを使用すると、連続してロードされた各モジュールが最初のモジュールを上書きします。これは、ファイルが一度だけ必要とされ、ロード時に各モジュールに動的に渡されるためです (これにより、モジュールを追加することができ、これらのモジュールは独自のルートを追加できます)。ここでモジュールの例を見ることができます: https://gist.github.com/2382bf93298e0fc58599

53 行目で、毎回別のインスタンスを作成する必要があることに気付いたので、standardControllers オブジェクトを新しいオブジェクトにコピーし、新しいオブジェクトを初期化して、新しいインスタンスを作成しようとしました。これはコードにまったく影響を与えず、コードはまったく同じように動作します。

アイデアはありますか?私はこれで少し詰まっています!

4

1 に答える 1

14

私が最初にすることは、単一責任の原則などを呼び出すことによって、物事を単純化し、結合を減らすことです. http://www.codinghorror.com/blog/2007/03/curlys-law-do-one-thing.html

それらのスキーマを独自のファイルに入れます。

models/client.js
models/assistant.js
models/contact.js

また、埋め込みドキュメント + マングースは一般的に PITA であることがわかりました。私はおそらくそれらすべてをトップレベルのドキュメントに昇格させます。

オブジェクトのキーを引用符で囲む必要はありません。

routes = {
   list: function() {} // no quotes is aok
}

また、一般的な REST アプリの「リスト」は「インデックス」と呼ばれます。ともかく。

わかりました、私はこれを別の方法で分割します。ミドルウェアで index.js ファイルからのものを要求しているため、それらは密結合になり、これは悪いことです。実際、私はこの全体を書き直して、より整然としたものにしたいと思います。ごめん。

おそらく、「ミドルウェア」ファイルをエクスプレスリソースコントローラーhttps://github.com/visionmedia/express-resource(エクスプレスの作成者によって構築された)に置き換えます 。これは、作成中のものなど、安らかなコントローラーに適したフレームワークです。オートローダーは本当に便利です。

http://mcavage.github.com/node-restify/も参照してください。これは新しいもので、まだ試していませんが、良いことを聞いています。

あなたが構築しているのは基本的に自動化されたマングースクラッドシステムであるため、オプションのオーバーライドを使用して、ベースとしてエクスプレスリソースコントローラーを作成します

/controllers/base_controller.js

そしてそれは次のように見えるかもしれません

var BaseController = function() {} // BaseController constructor

BaseController.prototype.index = function() {
   // copy from your middleware
}
BaseController.prototype.show = function() {
   // copy from your middleware
}
BaseController.prototype.create = function() {
   // copy from your middleware
}
// etc

module.exports = BaseController

次に、次のようにします。

/controllers/some_resource_controller.js

次のようになります。

var BaseController = require('./base_controller')
var NewResourceController = function() {
    // Apply BaseController constructor (i.e. call super())
    BaseController.apply(this, arguments) 
}

NewResourceController.prototype = new Base()

NewResourceController.prototype.create = function() {
    // custom create method goes here
}



module.exports = NewResourceController

それを使用するには、次のようにします。

var user = app.resource(myResourceName, new ResourceController());

myResourceName…設定しようとしているクラッドに設定されるいくつかのループ内。

ここにあなたが読むためのいくつかのリンクがあります:

また、テストを書いていないようです。テストを書きます。

于 2012-02-20T17:41:23.243 に答える