9

Express js を使用して単純な NodeJS Web サービスを記述します。私は歴史的にパイソン派です。

Django や Flask などのフレームワークでは、特定のエンドポイントでのみプラグインからのロジックを実装するために使用される Python デコレータがよく見られます。このパターンの例は、ここで見ることができます。

http://pythonhosted.org/Flask-Classy/#using-multiple-routes-for-a-single-view

私はExpressミドルウェアに取り組んでおり、すべてがapp.use3パリティ機能でうまく機能していますが、これはすべてのリクエストに対して実行されるロジックにのみ関連しています。プラグインのエンド ユーザーが、上記のソースで概説されているパターンと同様の特定のエンドポイントでのみ、(既に別の関数で) ロジックのパーセルを実行できるようにしたいと考えています。

これらのラッパーへの構成の一部は、アプリの開始時に渡されます。

これに対する最善のアプローチは何ですか?実際のルート ハンドラーを引数として受け取り、最後にそれを返す関数を使用して、このパターンをエミュレートする必要がありますか? このようなもの?

function pluginWrapper(endptFunc){
    //plugin logic here
    return endptFunc;
  }

  app.get('/endpt', pluginWrapper(function(req,res,next){
    //endpt logic here
    res.end()
  }));
4

1 に答える 1

11

以下は、明確な慣用的な戦略です。

  1. サイト全体のリクエストの大部分に関連するものは、通常の接続ミドルウェアになります。app.use(express.cookieParser())
  2. 特定のルートだけに関連するものは、そのルートだけに進むことができます: app.post('/users', express.bodyParser(), createUser). これは、上記のシナリオに最もよく一致すると思うパターンです
  3. 関連するミドルウェアのグループは、リストとして渡すことができます: app.get('/books', [paginate, queryLimit, memoize], getBooks). そしてもちろん、そのリストは変数またはモジュールであり、DRY 方式で共有される可能性があります。
  4. パス自体のパターンによってトリガーされる一般的な機能は、次を使用できますapp.paramapp.get('/:username/hobbies', getHobbies)
  5. 既存の通常の関数をミドルウェアにラップして、ミドルウェア API に適合させることができます。
  6. 通常どおり関数を呼び出すことができます。コードを再利用するすべての方法を、express の便利なパターンの 1 つに押し込む必要があるわけではありません。

あなたの質問にもっと直接的に対処するために、python デコレータ パターン 1-to-1 を javascript に移植しようとするべきではないと思います。ミドルウェアは本質的に同じことを達成します。デコレーターを使用して具体的な例を投稿すると、それらをエクスプレスで実装するための慣用的な方法を提案できます。

于 2013-11-06T16:08:32.443 に答える