web-dev-qa-db-ja.com

テストのためにExpressJSのインスタンスをプログラムでシャットダウンするにはどうすればよいですか?

Expressのインスタンスをシャットダウンする方法を見つけようとしています。基本的に、.listen(port)呼び出しの逆が必要です。Expressサーバーでリッスンを停止し、ポートを解放し、正常にシャットダウンするにはどうすればよいですか。

これは奇妙なクエリのように思えるので、ここにコンテキストを示します。これにアプローチする別の方法があるかもしれませんが、間違った方法で考えています。 socket.io/nodejsアプリのテストフレームワークをセットアップしようとしています。これは単一ページのアプリなので、テストスクリプトでは( Mocha を使用していますが、実際には問題ではありません)サーバーを起動し、テストを実行できるようにしたい、その後、サーバーをシャットダウンします。これを回避するには、テストを開始する前にサーバーの電源をオンにするか、いずれかのテストでサーバーを起動し、以降のすべてのテストでサーバーが起動していると想定しますが、これは非常に面倒です。各テストファイルで適切な設定でサーバーインスタンスを起動し、テストが終了したらそのインスタンスをシャットダウンすることをお勧めします。これは、テストの実行に奇妙な依存関係がなく、すべてがクリーンであることを意味します。また、起動/シャットダウンテストを実行できることも意味します。

だから、これを行う方法についてのアドバイスはありますか?手動で例外をトリガーしてそれを停止することを考えましたが、それは面倒です。 Expressのドキュメントとソースを掘り下げましたが、サーバーをシャットダウンする方法は見つかりません。このためにもsocket.ioに何かがあるかもしれませんが、ソケットサーバーはExpressサーバーに接続されているだけなので、エクスプレスレイヤーでこれを行う必要があると思います。

88
drewww

事柄が変更されました エクスプレスサーバーがノードhttpサーバーから継承しなくなったため。幸いなことに、app.listenはサーバーインスタンスを返します。

var server = app.listen(3000);

// listen for an event
var handler = function() {
  server.close();
};
133
Rich Apodaca

app.close()を使用します。完全な例:

_var app = require('express').createServer();
app.get('/', function(req, res){
  res.send('hello world');
});
app.get('/quit', function(req,res) {
  res.send('closing..');
  app.close();
});
app.listen(3000);
_

テストが終了したら、コールバック内でapp.close()を呼び出します。ただし、プロセスはまだ実行されていることに注意してください(ただし、もうリッスンしていません)。

この後、プロセスを終了する必要がある場合は、process.exit(0)を呼び出します。

リンク:

app.close: http://nodejs.org/docs/latest/api/http.html#server.close (同じことが適用されます)

process.exit: http://nodejs.org/docs/latest/api/process.html#process.exit

15

これを簡単に行うには、bashスクリプトを作成してサーバーを起動し、テストを実行し、サーバーを停止します。これには、そのスクリプトのエイリアスを作成して、すべてのテストを迅速かつ簡単に実行できるという利点があります。

継続的な展開プロセス全体でこのようなスクリプトを使用しています。 Jon RohanのDead Simple Gitワークフロー をご覧ください。

0
Josh Smith