Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get Node.JS Express to listen only on localhost?

I have an application that I have behind a reverse proxy, I would like for it to only listen to localhost/127.0.0.1.

I expected this to work:

app.listen(3001, 'localhost');

or

app.listen(3001, '127.0.0.1');

...but instead I get an error:

node.js:201     throw e; // process.nextTick error, or 'error' event on first tick           ^ TypeError: Cannot read property 'port' of null     at Object.<anonymous> (/home/ctoledo/hive-go/go.js:204:76)     at Module._compile (module.js:441:26)     at Object..js (module.js:459:10)     at Module.load (module.js:348:31)     at Function._load (module.js:308:12)     at Array.0 (module.js:479:10)     at EventEmitter._tickCallback (node.js:192:40) 

Running the application without a specifying the hostname works fine, ie., app.listen(3001);.

I am running Node v0.6.14 and express@2.5.5 and have read this google groups discussion and have found this comment in Express application.js saying: "This method takes the same arguments as node's http.Server#listen()."

Thanks for any help.

like image 507
nak Avatar asked Apr 09 '12 03:04

nak


People also ask

Can express be used without node?

You cannot use Express without NodeJS by definition so you have to deploy your backend somewhere else in you want to use it.


2 Answers

Thanks for the info, think I see the problem. This is a bug in hive-go that only shows up when you add a host. The last lines of it are:

app.listen(3001); console.log("... port %d in %s mode", app.address().port, app.settings.env); 

When you add the host on the first line, it is crashing when it calls app.address().port.

The problem is the potentially asynchronous nature of .listen(). Really it should be doing that console.log call inside a callback passed to listen. When you add the host, it tries to do a DNS lookup, which is async. So when that line tries to fetch the address, there isn't one yet because the DNS request is running, so it crashes.

Try this:

app.listen(3001, 'localhost', function() {   console.log("... port %d in %s mode", app.address().port, app.settings.env); }); 
like image 154
loganfsmyth Avatar answered Sep 21 '22 04:09

loganfsmyth


You are having this problem because you are attempting to console log app.address() before the connection has been made. You just have to be sure to console log after the connection is made, i.e. in a callback or after an event signaling that the connection has been made.

Fortunately, the 'listening' event is emitted by the server after the connection is made so just do this:

var express = require('express'); var http = require('http');  var app = express(); var server = http.createServer(app);  app.get('/', function(req, res) {     res.send("Hello World!"); });  server.listen(3000, 'localhost'); server.on('listening', function() {     console.log('Express server started on port %s at %s', server.address().port, server.address().address); }); 

This works just fine in nodejs v0.6+ and Express v3.0+.

like image 42
dgh Avatar answered Sep 23 '22 04:09

dgh