0

高速ルートでカスタム イベント リスナーを処理する最良の方法は何ですか?

私はおそらくすべて間違っていますが、現時点で私が持っているものは次のとおりです。

module.exports = {
    get: function(req, res, next) { 

        MyModel.on('error', function(err) {
          res.send(501)
        })

        MyModel.on('found', function() {
          res.send(200)
        })

        MyModel.on('notFound', function() {
          res.send(404)
        })

        MyModel.findByName(req.params.name);
      }
}

各イベントリスナーが各リクエストに追加されるため、これは完全に間違っていることがわかります。

また、イベントが発生したときの応答を容易にするために応答オブジェクトを渡し始めるのも間違っていると感じます。

メソッドでコールバックを使用することもできますがfindByName、イベント システムに結び付けるのが本当に好きですが、この状況をより適切に処理する方法を考えています。

4

1 に答える 1

1

これにはイベントバインディングを使用せず、コールバック関数を使用してください。

module.exports = {
    get: function(req, res, next) {
        MyModel.findByName(req.params.name, function (error, model) {
            if (error) {
                return res.status(501).send(error);
            }
            if (!model) {
                return res.status(404).send('Not found');
            }
            res.send(model.toJSON());
        });
      }
}

コメントに基づいていくつかの説明を追加するために、あなたの例では、同じ元の作成者によるエクスプレスとマングースを使用しており、どちらも主に関数型プログラミングとコールバックを対象としています。イベント、コールバック、またはその両方/いずれか(オプション)を使用するフレームワークを設計することは可能ですが、これら2つの特定のケースでは、ライブラリはこれらの特定の操作のイベントを提供しないため、コールバックの使用を強制します。そのため、これらの特定の呼び出しのエクスプレスとマングースの場合、コールバックは理想的なものです。

例を見ると、mongooseはModelクラスレベルでいくつかのイベントを発行しますが、それらは明示的な要求/応答に関連付けられていないため、エラーロギングや例外処理、および基本的なWebアプリケーション以外のその他の特殊なユースケースに適しています。応答レンダリング。

したがって、「このためにイベントバインディングを使用しない」と言ったとき、イベントバインディングが決して適切ではないという意味ではありませんでした。特定のコードスニペットが与えられた場合、それらは使用しているライブラリでサポートされておらず、この例では慣用的でもありません。基本的なmake-a-db-query-and-send-back-a-web-pageシナリオ。

于 2013-03-19T14:10:13.017 に答える