Pertanyaan Bagaimana cara saya mematikan instance dari ExpressJS untuk pengujian?


Saya mencoba mencari cara mematikan instance Ekspres. Pada dasarnya, saya ingin kebalikan dari .listen(port) panggilan - bagaimana cara mendapatkan server Express untuk STOP mendengarkan, lepaskan port, dan shutdown bersih?

Saya tahu ini sepertinya permintaan yang aneh, jadi inilah konteksnya; mungkin ada cara lain untuk mendekati ini dan saya memikirkannya dengan cara yang salah. Saya mencoba menyiapkan kerangka pengujian untuk aplikasi socket.io/nodejs saya. Ini adalah aplikasi satu halaman, jadi dalam skrip pengujian saya (saya menggunakan Moka, tapi itu tidak terlalu penting) Saya ingin dapat memulai server, menjalankan pengujian terhadapnya, dan kemudian mematikan server. Saya bisa mengatasi ini dengan mengasumsikan bahwa server dinyalakan sebelum tes dimulai atau dengan memiliki salah satu tes memulai server dan memiliki setiap tes berikutnya mengasumsikan itu naik, tapi itu benar-benar berantakan. Saya akan lebih suka untuk memiliki setiap file tes memulai contoh server dengan pengaturan yang sesuai dan kemudian menutup contoh yang turun ketika tes selesai. Itu berarti tidak ada dependensi aneh untuk menjalankan tes dan semuanya bersih. Itu juga berarti saya bisa melakukan pengujian startup / shutdown.

Jadi, ada saran tentang cara melakukan ini? Saya telah berpikir tentang secara manual memicu pengecualian untuk menurunkannya, tetapi itu tampaknya berantakan. Saya telah menggali melalui dokumen dan sumber Ekspres, tetapi sepertinya tidak dapat menemukan metode apa pun yang akan mematikan server. Mungkin juga ada sesuatu di socket.io untuk ini, tetapi karena server socket hanya terpasang ke server Express, saya pikir ini perlu terjadi pada lapisan ekspres.


76
2017-12-28 17:11


asal


Jawaban:


Banyak hal telah berubah karena server ekspres tidak lagi mewarisi dari server http node. Untungnya, app.listen mengembalikan instance server.

var server = app.listen(3000);

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

110
2018-06-07 16:50



Menggunakan app.close(). Contoh lengkap:

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);

Panggilan app.close() di dalam callback ketika tes telah berakhir. Tetapi ingat bahwa prosesnya masih berjalan (meskipun tidak mendengarkan lagi).

Jika setelah ini, Anda harus mengakhiri prosesnya, kemudian menelepon process.exit(0).

Tautan:

app.close: http://nodejs.org/docs/latest/api/http.html#server.close (Sama berlaku untuk)

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


12
2017-12-28 18:38



Anda dapat dengan mudah melakukan ini dengan menulis skrip bash untuk memulai server, menjalankan pengujian, dan menghentikan server. Ini memiliki keuntungan memungkinkan Anda untuk alias ke skrip tersebut untuk menjalankan semua pengujian Anda dengan cepat dan mudah.

Saya menggunakan skrip semacam itu untuk seluruh proses penerapan berkelanjutan saya. Anda harus melihat Lam Rohan Mati Wikipedia Git Workflow untuk beberapa wawasan tentang ini.


0
2017-12-28 17:28