tutup server dari dalam router
Saya membuat aplikasi ekspres seperti ini
const express = require('express')
const app = express();
app.use(express.static(path.join(__dirname, 'public')));
app.post('/close', async (_, res) => {
res.status(200);
res.end();
app.close();
});
module.exports = app;
Saya membuat contoh di modul lain
const myApp = require('./app.js');
myApp.listen(port, () => {
console.log(`Started server on ${port}`);
});
Saya ingin server mati sendiri ketika menerima permintaan posting ke /close. Saat ini, saya baru saja mendapatkan app.closekesalahan bukan fungsi.
Saya tahu saya dapat menutup server secara eksternal seperti ini
const server = myApp.listen(port, () => {
console.log(`Started server on ${port}`);
});
server.close();
tetapi saya ingin menutup server atas permintaan posting ke /close, bagaimana cara melakukannya?
Jawaban
Untuk mendapatkan akses ke objek server Anda, coba gunakan
req.connection.server
dari dalam penangan rute Anda.
.close()membuat server berhenti mendengarkan koneksi baru. Koneksi yang sudah dibuat tidak terpengaruh. Objek server memancarkan 'close'peristiwa ketika semua koneksi terbuka telah terputus.
process.exit() menghentikan seluruh aplikasi nodejs Anda.
Jadi, kode ini mungkin melakukan apa yang Anda inginkan.
app.post('/close', (req, res, next) => {
res.status(200)
res.end()
const server = req.connection.server
if (server.listening) {
server.addEventListener('close', ev => {
console.log('server closed. See ya later alligator.')
process.exit(0)
})
console.log('closing server')
server.close()
}
});
Jika Anda perlu mendapatkan objek server dari objek aplikasi Anda (jika mendapatkannya dari objek req Anda tidak cukup), Anda dapat memasukkan fungsi middleware kecil seperti ini.
app.use( function adornApp( req, res, next ) {
req.app.locals.server = req.connection.server
next()
} )
Kemudian Anda akan bisa mendapatkan server app.locals.serverAnda setelah middleware Anda pertama kali dipanggil.
Anda dapat menggunakan paket http-terminator untuk menutup server Anda. Trik berikut harus dilakukan. Alasan kami menggunakan the http-terminatoradalah karena server tidak akan menutup jika dikunjungi melalui sebuah rute.
const { createHttpTerminator } = require("http-terminator");
const { initApp, app } = require("./app.js");
const PORT = 3000;
const server = app.listen(PORT, () => {
console.log(`Started server on ${PORT}`);
});
const httpTerminator = createHttpTerminator({ server });
initApp(httpTerminator);
Di dalam modul:
const express = require("express");
const app = express();
const initApp = (httpTerminator) => {
app.get("/close", async (_, res) => {
res.json({ message: "we closed" });
await httpTerminator.terminate();
});
};
module.exports = { initApp, app };