node.js を開始したばかりで、http://nodebeginner.org/index.htmlを実行しました。素晴らしいスタートチュートリアルですが、リクエストとレスポンスの両方を「グローバル」にすることが可能であるため、現在の受信リクエスト用にロードされたモジュールは、注入するのではなく、これらにアクセスできることを本当に知りたいです。
アイデア?
node.js を開始したばかりで、http://nodebeginner.org/index.htmlを実行しました。素晴らしいスタートチュートリアルですが、リクエストとレスポンスの両方を「グローバル」にすることが可能であるため、現在の受信リクエスト用にロードされたモジュールは、注入するのではなく、これらにアクセスできることを本当に知りたいです。
アイデア?
ほとんどの Web スクリプト言語とは異なり、ノードでは、さまざまなクライアントからの多数の HTTP リクエストが同時に「アクティブ」になる可能性があります。応答しているクライアントをどのようにして知ることができますか?
したがって、常に 1 つの要求と応答しかないと考えていても、実際には現在のすべてのクライアントに対してオープンな要求があります。
非同期イベント ループにより、理論的にはリクエストとレスポンス変数をグローバルに利用できるようにすることは可能ですが、現在のコンテキストから戻るとすぐに (他の非同期処理を呼び出す場合でも)、キュー内の次のイベントは次のようになります。実行されました。
ここで、その間に接続する別の HTTP クライアントについて考えてみましょう。グローバル変数が再び変更され、古いものは失われます。結局、あなたのアプローチは漏れています。
独自のコードを実行するスレッドが 1 つしかないため、すべてが明らかにスレッドセーフです。ただし、次に実行されるイベント/コールバックが何であるかがわからないため、無効な状態 (変数など) から保護する必要があります。
continuation-local-storageはこの問題を解決します。私の理解が正しければ、ドメインにはいくつかの類似点がありますが、非推奨ではありません。:D
この投稿で少し説明します。そして関連するスライドショー。
可能ですが、応答オブジェクトと要求オブジェクトへの参照を保持する配列が必要になります。そして、配列内のオブジェクトを見つけるインデックスをモジュールに伝える必要があります。また、配列をクリーンアップする必要があります。したがって、いくつかの情報をモジュールに渡すことを避けることはできません。
リクエストとレスポンスのオブジェクト参照をモジュールに直接渡すことをお勧めします。
オブジェクトは参照によって渡されることに注意してください。そのため、オブジェクトを関数/モジュールに渡すときに大きなオーバーヘッドはありません。