1

ExpressJS の初心者の質問:

REST 要求に応答し、読み取り専用の DB 応答を行う、かなり単純な (しかし大規模な) ExpressJS プロジェクトを作成することを計画しています。エラーをキャプチャするための NodeJS ドメインについて読みましたが、このプロジェクトでそれが必要かどうかはわかりません。私のテストでは、キャッチされないスローやクラッシュが最悪の場合でも、サーバー全体ではなく、個々の REST 要求のみが失敗することが示されているようです。

私は正しいですか?NodeJS ドメイン API: http://nodejs.org/api/domain.html#domain_class_domain

(明らかに、私が尋ねる理由は、プロジェクトの最後にドメイン機能を事後的に実装するのが難しいからです)。

この記事では、必要がなければ Express に NODEJS を使用するという考えに冷たい感情を覚えました (必要がなければ、コードを複雑にしません)。

Node.js - 別のドメイン内の Express リクエストごとのドメイン

4

3 に答える 3

3

このモジュールを使用すると、ドメインを機能させる作業が大幅に軽減されます: https://github.com/brianc/node-domain-middleware

それ以外に、個々のリクエストのみが失敗する可能性があるのは事実ですが、エラーによってサーバーが悪い状態になることがあります (リークされたリソースはその一例です)。その時点でサーバーを再起動することをお勧めします。Express のビルトイン エラー ハンドラがそれを処理する場合、自分でサーバーをシャットダウンすることはできません。このように、ドメインを持っていると便利な理由の 1 つは、それをキャプチャするためのポイントをコードに含めることができるからです。上記のミドルウェアは、エラー処理コードをメイン フローから抜き出し、クリーンな状態に保つために多くのことを行います。

forkyと組み合わせると、さらに良くなります。

于 2014-01-14T16:10:00.460 に答える
3

各エクスプレス リクエストを個別のドメインに割り当てることで、次のことが可能になります。

  • エラーに関する意味のある情報を取得します: エラーを引き起こしたクエリ、リクエストを実行したユーザーなど。

  • サーバーを再起動する前に、他のリクエストが正常に完了するまでしばらく待ちます。これが、node.js ドキュメントのこの例のポイントです。

ただし、 node-mysql などのサードパーティ製モジュールを呼び出すと、気付かないうちに別のドメインに切り替えられる可能性があるため、注意が必要です。

非同期モジュールを呼び出す前に、常にこれを使用します。

exports.preserveDomain = function (fun) {
  var d = process.domain;

  return function () {
    var args = arguments;

    d.run(function () {
      fun.apply(null, args);
    });
  };
};

この問題について講演を行いました。興味のある方はスライドをご覧ください。

于 2014-01-14T16:44:10.760 に答える
1

悲しいことに、ノードドメインは非推奨になったため、おそらく使用しないでください (また、このミドルウェアも使用しないでください) :(

https://nodejs.org/api/domain.html

この欠点を克服するために、非同期コードを記述するためのコルーチン ベースのライブラリを作成しました: https://github.com/vacuumlabs/yacol。これをプロジェクトで使用すると、適切なセマンティクスを備えたすべてのドメインの利点を得ることができます。

于 2016-11-26T10:21:00.557 に答える