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.
You cannot use Express without NodeJS by definition so you have to deploy your backend somewhere else in you want to use it.
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); });
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+.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With