問題タブ [node.js-domains]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
5 に答える
9629 参照

node.js - ExpressでNode.js 0.8.xドメインを使用するには?

各リクエストを独自のドメインにラップする Express/Connect ミドルウェアを作成するにはどうすればよいですか?

0 投票する
5 に答える
5159 参照

node.js - Express を使用して node.js ドメインで例外を処理できない

Node.js ドメインを使用して例外をキャッチしたいと考えています。これまでのところ動作していますが、例外をキャッチするためにドメインを取得できない場所が 1 つあります。コールバックの例外 2 は、domain.on('error') ハンドラーでキャッチされて処理されますが、例外 1 はキャッチされません。奇妙なことに、例外 1 がスローされたときに、予想どおり Node がシャットダウンされません。これが私のサンプルアプリです:

例外 2 を実行するために、例外 1 をコメントアウトします。

0 投票する
1 に答える
146 参照

node.js - ドメインが例外をキャッチしないのはなぜですか?

ドメインが以下のエラーを処理しないのはなぜですか?

繰り返しますが、以下のコードで完全に機能します。

0 投票する
1 に答える
629 参照

javascript - 適切なタイミングでドメインの dispose を呼び出せません

モジュールに問題がありdomainます。現在、リクエストでスローされたキャッチされていないエラーをキャッチしようとしています。expressミドルウェアとドメインの使用。すべてのリクエストは、この関数を呼び出しnextて適切なルートに移動する前に、この関数を介してルーティングされます。

問題は、エラーがスローされない場合にドメインを破棄するにはどうすればよいかということです。

ドメインとイベントをミドルウェアの外に引き上げることができるので、破棄する必要はありませんが、500 を送信する必要があるミドルウェア引数にアクセスできなくなります。

私がこれをどのように処理しているかについて、誰かがより良い解決策を持っていますか? これを処理する方法 (および多くのハックな方法) を見つけようとして、私はあまりにも多くの時間を費やしました。ありがとう。

0 投票する
1 に答える
202 参照

javascript - 部屋ごとに異なる同じ配列を定義するnode.js

タイトルで述べたように、部屋ごとに異なる配列を定義したいと考えています。例えば:

room1の場合、配列はvar colors=['red','blue'],

room2の場合、配列は になりますvar colors=['black','white']。(同名で内容は異なります)

これが私の単純化されたサーバーです:

if(h=='room1') { var colors=['a','b'];} elseif(room=='room2') { var colors=['y','z']; }部屋がたくさんあるので、私はそのようなものを望んでいません。

どうすればこれを達成できますか? ルームの代わりに名前空間を使用する必要がありますか?

0 投票する
0 に答える
184 参照

node.js - NodeJS ドメイン モジュールが正常に終了しない

ノードJSでドメインを実験してきました。コードは期待どおりに機能しますが、コードが完了したときにノードが正常に終了しないため、収集されていないガベージまたは理解できない何かがあると思われます。助言がありますか?カットダウンの例を次に示します。

0 投票する
1 に答える
201 参照

node.js - node.jsドメインのグローバルエミッターを追加するには?

私のnode.jsアプリケーションでは、ドメインごとにエラーを処理していました。アプリのアーキテクチャは次のようになります。

  1. コントローラー。高速ルーティング呼び出しコントローラー メソッド

  2. コントローラーはサービスを呼び出し、モデルを使用します

  3. サービス呼び出しリポジトリ

(実際には、DDD に非常に似ています)。

したがって、コントローラーはドメインを作成し、そのドメインで実際の本体を実行します。何か問題が発生した場合に例外をスローするために使用されるサービス。また、コントローラはドメイン エラーをリッスンして処理します。すべてのサービスのメソッド呼び出しスタックでエラーが発生することを心配する必要がないため、非常に快適です。例外をスローするだけで、コントローラーでキャッチされることを確認できます。

しかし、PostgreSQL の使用に関連する問題に直面しました。node-postgres モジュールを使用し、個別の js ファイルで pg.Client を作成するため、pg.Client はすべての人に共有されます (それ以外の場合、各クエリで pg.Client を作成すると、postgres とのアクティブな接続が多数開かれます)。

問題は、pg.Client が別ファイルで定義されている場合、グローバル オブジェクトのようになり、コントローラーで作成されたドメイン スコープに含まれないことです。したがって、pg.Client コールバックからスローされた例外は、ドメインによってキャッチされません。

明確にするために、リクエスト処理の簡単な方法を示します。ユーザーが userId でログインしたいとします。

  1. 最初の pg.Client のどこかに作成されました

  2. Get リクエストが Express に来る、Express コール ルーティング メソッド

  3. ルーティングはコントローラーのメソッドの一部を呼び出します

  4. コントローラーはドメインを作成し、«domain.run» サービスを呼び出します

  5. サービスがリポジトリを呼び出す

  6. リポジトリは以前に作成された pg.Client を取得し、SQL クエリ メソッドを呼び出します

  7. SQLクエリメソッドの結果はコールバックに入れられます(したがって、このコールバックはpg.Clientによって呼び出されます)

  8. 次に、コールバックがサービスで処理されます。ここで、ユーザー モデルの代わりに null を取得することを確認し (指定された userId に対して db にそのようなユーザーが存在しないため)、例外をスローします。

したがって、その例外はドメインでキャッチされません。技術的には、ノード ドメインの «add» メソッドを使用して pg.Client を追加する必要がありますが、pg.Client は共有されているため、別の同時ドメインに追加されることになります。

より明確にするために、いくつかのコード例をリストします。UserService の簡略化されたメソッドです。

したがって、そのメソッド «login» はドメインで呼び出されます。しかし、それはuserRepositoryを作成し、ドメインのスコープ外にある共有pg.Clientを使用するfindByEmailメソッドを呼び出します。そのため、ドメインで例外がキャッチされません。

それを修正して pg.Client をドメインに入れる方法はありますか?