Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to properly close node-express server?

I need to close server after getting callback from /auth/github/callback url. With usual HTTP API closing server is currently supporting with server.close([callback]) API function, but with node-express server i’m getting TypeError: Object function app(req, res){ app.handle(req, res); } has no method 'close' error. And I don't know how to find information to solve this problem.
How should I close express server?

NodeJS configuration notes:

$ node --version
v0.8.17
$ npm --version
1.2.0
$ npm view express version
3.0.6

Actual application code:

var app = express();

// configure Express
app.configure(function() {
    // … configuration
});

app.get(
    '/auth/github/callback',
    passport.authenticate('github', { failureRedirect: '/login' }),
    function(req, res) {
        res.redirect('/');

        setTimeout(function () {
            app.close();
            // TypeError: Object function app(req, res){ app.handle(req, res); } has no method 'close'
        }, 3000)
    }
);

app.listen('http://localhost:5000/');

Also, I have found ‘nodejs express close…’ but I don't sure if I can use it with code I have: var app = express();.

like image 851
Vladimir Starkov Avatar asked Jan 25 '13 05:01

Vladimir Starkov


People also ask

What is graceful shutdown Express?

Procedure of Graceful Shutdown: For this purpose, a SIGTERM (the program manager sends it ) signal is sent to the application that tells it that it is going to be killed. After getting this signal, the app stops accepting the new requests, by letting the load balancer know that is not going to accept any new requests.

What does server close do?

The server. close() method stops the HTTP server from accepting new connections. All existing connections are kept.


3 Answers

app.listen() returns http.Server. You should invoke close() on that instance and not on app instance.

Ex.

app.get(
    '/auth/github/callback',
    passport.authenticate('github', { failureRedirect: '/login' }),
    function(req, res) {
        res.redirect('/');

        setTimeout(function () {
            server.close();
            // ^^^^^^^^^^^
        }, 3000)
    }
);

var server = app.listen('http://localhost:5000/');

You can inspect sources: /node_modules/express/lib/application.js

like image 129
Vladimir Kuznetsov Avatar answered Oct 09 '22 13:10

Vladimir Kuznetsov


In express v3 they removed this function.

You can still achieve the same by assigning the result of app.listen() function and apply close on it:

var server = app.listen(3000);
server.close((err) => {
  console.log('server closed')
  process.exit(err ? 1 : 0)
})

https://github.com/visionmedia/express/issues/1366

like image 41
Michael Avatar answered Oct 09 '22 13:10

Michael


If any error occurs in your express app then you must have to close the server and you can do that like below-

var app = express();
var server = app.listen(process.env.PORT || 5000)

If any error occurs then our application will get a signal named SIGTERM. You can read more SIGTERM here - https://www.gnu.org/software/libc/manual/html_node/Termination-Signals.html

process.on('SIGTERM', () => {
  console.info('SIGTERM signal received.');
  console.log('Closing http server.');
  server.close((err) => {
    console.log('Http server closed.');
    process.exit(err ? 1 : 0);
  });
});
like image 14
Neha Sharma Avatar answered Oct 09 '22 12:10

Neha Sharma