21

私はいくつかのテストを書いており、HTTP サーバーをプログラムで開始/停止できるようにしたいと考えています。HTTP サーバーを停止したら、それを開始したプロセスを終了させたいと思います。

私のサーバーは次のようなものです:

// file: `lib/my_server.js`

var LISTEN_PORT = 3000

function MyServer() {
  http.Server.call(this, this.handle) 
}

util.inherits(MyServer, http.Server)

MyServer.prototype.handle = function(req, res) { 
  // code 
}

MyServer.prototype.start = function() {
  this.listen(LISTEN_PORT, function() {
    console.log('Listening for HTTP requests on port %d.', LISTEN_PORT)
  })
}

MyServer.prototype.stop = function() {
  this.close(function() {
    console.log('Stopped listening.')
  })
}

テストコードは次のようになります。

// file: `test.js`

var MyServer = require('./lib/my_server')
var my_server = new MyServer();

my_server.on('listening', function() {
  my_server.stop()
})

my_server.start()

を実行すると、期待どおりnode test.jsの出力が得られます。stdout

$ node test.js
Listening for HTTP requests on port 3000.
Stopped listening.

node test.jsしかし、プロセスを生成して終了し、シェルに戻る方法がわかりません。

これで、ノードがリッスンしているイベントのイベント ハンドラーがバインドされている限り、ノードが実行され続けることを (抽象的に) 理解しました。でnode test.jsシェルを終了するには、my_server.stop()イベントのバインドを解除する必要がありますか? もしそうなら、どのイベントから、どのオブジェクトから?すべてのイベントリスナーを削除して変更を試みMyServer.prototype.stop()ましたが、うまくいきませんでした。

4

3 に答える 3

5

http.Server#close

https://nodejs.org/api/http.html#http_server_close_callback

module.exports = {
    
    server: http.createServer(app) // Express App maybe ?
                .on('error', (e) => {
                    console.log('Oops! Something happened', e));
                    this.stopServer(); // Optionally stop the server gracefully
                    process.exit(1); // Or violently
                 }),

    // Start the server
    startServer: function() {
        Configs.reload();
        this.server
            .listen(Configs.PORT)
            .once('listening', () => console.log('Server is listening on', Configs.PORT));
    },
    
    // Stop the server
    stopServer: function() {
        this.server
            .close() // Won't accept new connection
            .once('close', () => console.log('Server stopped'));
    }
}

ノート:

  • 「close」コールバックは、残りのすべての接続の処理が終了したときにのみトリガーされます
  • プロセスも停止したい場合は、 「close」コールバックで process.exit をトリガーします
于 2017-01-01T20:25:43.587 に答える