chiudere il server dall'interno del router
Creo un'app express come questa
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;
Lo istanzio in un altro modulo
const myApp = require('./app.js');
myApp.listen(port, () => {
console.log(`Started server on ${port}`);
});
Voglio che il server si spenga da solo quando riceve una richiesta di post /close. Al momento, ottengo solo app.closeun errore non è una funzione.
So di poter chiudere un server esternamente in questo modo
const server = myApp.listen(port, () => {
console.log(`Started server on ${port}`);
});
server.close();
ma voglio chiudere il server su una richiesta di post a /close, come posso farlo?
Risposte
Per ottenere l'accesso al tuo oggetto server, prova a utilizzare
req.connection.server
dall'interno del gestore del percorso.
.close()fa in modo che il server smetta di ascoltare nuove connessioni. Le connessioni già stabilite non sono interessate. L'oggetto server emette un 'close'evento quando tutte le connessioni aperte si sono disconnesse.
process.exit() arresta l'intera app nodejs.
Quindi, questo codice potrebbe fare quello che vuoi.
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()
}
});
Se hai bisogno di ottenere l'oggetto server dall'oggetto app (se ottenerlo dall'oggetto req non è abbastanza buono), potresti inserire una piccola funzione middleware come questa.
app.use( function adornApp( req, res, next ) {
req.app.locals.server = req.connection.server
next()
} )
Quindi sarai in grado di ottenere il tuo server app.locals.serveruna volta che il tuo middleware viene richiamato per la prima volta.
È possibile utilizzare il pacchetto http-terminator per chiudere il server. Quanto segue dovrebbe fare il trucco. Il motivo per cui utilizziamo http-terminatorè perché il server non si chiude se viene visitato tramite un percorso.
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);
All'interno del modulo:
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 };