mitchkman
mitchkman

Reputation: 6680

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?

Upvotes: 1

Views: 478

Answers (1)

Rowan Freeman
Rowan Freeman

Reputation: 16348

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

Upvotes: 2

Related Questions