Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Express server doesn't close

I'm creating an Express server with reloadable endpoints.
To make this possible I created an endpoint for such a purpose.

But when I call server.close() on the Express's HTTP server it still continues listening, while the server.listening says otherwise, it still is.

Here is a simplified version of my script (Not working fully, but you get the gist):

class simpleServer {
    constructor() {
         let express = require('express');
         this.app = express();
         this.app.get('/reload', this.reload);
         this.server = this.app.listen(3000);
    }

    reload(req, res) {
         console.log('Closing server');             

         this.server.close(function() {
             console.log('Closed server');
         });
         
         // Re-init & stuff

         res.json({
             message: 'Reloaded'
         });
    }
}

let server = new simpleServer();

When I call the endpoint, the server will output 'Closing server', but the 'Closed server' takes a long time to be called (5 minutes). And when I reload the page, it still works, while the server.listening is equal to false.

I'm using Node.js version 6.0.0 with Express version 4.14.0.


Some updates:

I fixed the issue by calling req.destroy() after sending the response, does this have any side-effects tho?

A cleaner fix would be keeping a record of current connections and closing those in the reload function instead of closing them instantly. This will probably be less heavy if you have a higher load.

like image 847
lorenzo373 Avatar asked Aug 12 '16 08:08

lorenzo373


People also ask

How do I exit an Express Server?

To properly close Node Express server, we can call the close method. to call server. close with a callback that has the error err parameter. If err is set, then there's an error when closing the Express server and we call process.

Is Express JS unmaintained?

It is unmaintained Express has not been updated for years, and its next version has been in alpha for 6 years. People may think it is not updated because the API is stable and does not need change. The reality is: Express does not know how to handle async/await .


1 Answers

When you call .close(), it only stops accepting new connections, it does not terminate existing connections.

The reason it may take some time to actually close is if there are existing connections that have set Connection: keep-alive in case of more requests.

like image 156
mscdex Avatar answered Oct 16 '22 04:10

mscdex