なぜserver.close()
,却不能触发 close
イベントを使用するのですか?
HTTP API の説明を見てください:
新しい接続を受信するサーバーを停止します。
TCP API の説明:
サーバーが新しい接続の受け入れを停止し、既存の接続のみを維持します。この関数は非同期であり、すべての接続が切断されるとサーバーが閉じられ、「close」イベントが生成されます...
オリジナルserver.close()
只是使服务器停止接收新连接,并没有直接操作关闭服务器。只有当所有连接都断开的时候,服务器才会处于关闭状态并且发射 close
イベント。
ただし、コードを遅延呼び出しに変更すると、サーバーが直接シャットダウンされる可能性があります (もちろん、HTTP
接続は 5 秒以内に確立する必要があります)。
API の説明に従う場合、close()
メソッドは、サーバーによる新しい接続の受け入れを停止するだけです。では、なぜ後者の方法に変更することでサーバーを直接シャットダウンできるのでしょうか?
APIの説明は正しいです。どちらのタイプのシャットダウン http サービスも最終的にはシャットダウンされますが、実行ロジックが異なります。
実行プロセス
コード 1 は、http 接続を要求するまで閉じずに http 接続が確立されるのを待ち、この要求の 2 分後に http サービスを閉じます。
コード 2 は 5 秒間待機します。5 秒以内に接続が確立されない場合、http サービスは直接終了します。 5 秒以内に http 接続をリクエストすると、http サービスはリクエストから 2 分後に終了します。
プロセスを実行する理由
原来 server.close() 只是使服务器停止接收新连接,并没有直接操作关闭服务器。只有当所有连接都断开的时候,服务器才会处于关闭状态并且发射 close 事件。
问题在于什么时候算所有连接都断开
?res.end('res ok'); を実行すると、リクエストにより http 接続は閉じられません
Connection
是keep-alive
この時点では、http サービスのみがデータを返し、ブラウザはページをレンダリングし、http 接続はそのままになります。その後、2 分以内に新しいリクエストがない場合、今度は http 接続が閉じられます。 2 分は、http サービス (http リクエストではない) のデフォルトのタイムアウトです。もうすぐ