NodeJS recently began acting weirdly by defaulting to IPv6 (tcp6) on CentOS 7.x. I'm using ExpressJS and PM2 to run Node, and all firewalls were disabled.
Following are the results of the ss -tnlp and the netstat -tnlp commands when only app.listen(3000) is used:


Setting the host individually to app.listen(3000, "127.0.0.1") and app.listen(3000, "0.0.0.0") forces the app to use IPv4 however it refuses connections, as can be seen from the below screenshot:

Following are the results when executing netstat -tnlp after forcing IPv4:

It's listening on 127.0.0.1, a.k.a. localhost, not 0.0.0.0. Fix your code to use the right address and it should work.
I'm going to close this because this is not an issue with node.js itself. If you have follow-up questions, please post them to the help repo.
Listening on IPv6 took me by surprise as well, but apparently this behavior is described in the documentation:
If host is omitted, the server will accept connections on the unspecified IPv6 address (::) when IPv6 is available, or the unspecified IPv4 address (0.0.0.0) otherwise.
Note: In most operating systems, listening to the unspecified IPv6 address (::) may cause the net.Server to also listen on the unspecified IPv4 address (0.0.0.0).
Most helpful comment
Listening on IPv6 took me by surprise as well, but apparently this behavior is described in the documentation: