tutup server dari dalam router

Nov 16 2020

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

2 O.Jones Nov 16 2020 at 19:33

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.

Reyno Nov 16 2020 at 18:12

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