mitchkman mitchkman - 24 days ago 15
Node.js Question

Why does Node.js/Express not accept connections from localhost?

I encountered this strange behavior today I could not find a cause for. I am using MacOS Sierra.

I have this code (Express):

app.server.listen(config.port, config.address, function () {
logger.info('app is listening on', config.address + ':' + config.port);
});


And it prints

app is listening on 127.0.0.1:5000


How ever, if I try to
curl
, it fails.

$ curl http://localhost:5000/api/ping
curl: (56) Recv failure: Connection reset by peer


I checked my hosts file:

$ cat /etc/hosts
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
##
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost


So I ping localhost to make sure it resolves to
127.0.0.1
:

$ ping localhost
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.061 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.126 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.135 ms
^C
--- localhost ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.061/0.107/0.135/0.033 ms


I try again, but it fails

$ curl http://localhost:5000/api/ping
curl: (56) Recv failure: Connection reset by peer


Now I try to use
127.0.0.1
instead and voila, it works?

$ curl http://127.0.0.1:5000/api/ping
pong


What's wrong?

Answer

cURL is trying to connect via IPv6 but your Express server is listening on 127.0.0.1 which is IPv4.

You can force cURL to connect via IPv4 with the -4 option.

curl -4 http://127.0.0.1:5000/api/ping
Comments