Use a node app from another device locally - node.js

I have a server (10.0.0.12) and my laptop (10.0.0.2) on a local network.
When I run curl http://10.0.0.2:3000 on the server, it works fine. When I run curl http://10.0.0.12:3000 on my laptop, it doesn't work saying site is unavailable.
I am able to ping and ssh into the server from my laptop.
Here is my code to finish the connection:
app.set('port', (3000));
app.listen(app.get('port'), function(){
console.log("Node app running on localhost:" + app.get('port'));
}
I've tried passing in an ip address to the listen() function, but made no difference. I tried passing in 10.0.0.12 (the ip address of the server), 127.0.0.1, and 0.0.0.0 all with the same result.
How can I host my node app on a local network and have everyone who is on the local network be able to access it through the browser?
EDIT: I'm running on CentOS 7.
EDIT2: When I run netstat -lnt, it says this:
tcp 0 0 0.0.0.0:3000 0.0.0.0:* LISTEN

Have you tried to just omit the IP address? It should then be available on the IP address of the machine it is running on and the specified port.

As suggested by HA. remove the IP.
As you can see from the documentation:
https://nodejs.org/api/http.html#http_server_listen_port_hostname_backlog_callback
If the hostname is omitted, the server will accept connections directed to any IPv4 address (INADDR_ANY).
P.S. Which is the OS on the server?

Maybe you can try :
app.listen(3000, '0.0.0.0', function(){
console.log("Node app running on 0.0.0.0:3000");
}

A possible issue could be you aren't using the http module?
var http = require('http').Server(app);
http.listen(3000, function () {
console.log('App running on port 3000');
});
A good practice would be set the port like
app.set('port', (3000));
var http = require('http').Server(app);
http.listen(app.get('port'), function () {
console.log('App running on port ' + app.get('port'));
});

Related

Cant access nodejs server using machine ip address instead of localhost

I am using windows 10 as OS
Iam trying to access my node.js server from another device browser in the same network using my device ip address in our network--> ipv4 192.168.X.X " its obtaind using ipconfigin cmd" and port "4000", i did the following configration in my code:
module.exports = {
server: app,
start: (port) => {
const PORT = port || process.env.PORT || 4000;
server.listen(PORT,'0.0.0.0', () => { console.log(`Listening on port ${PORT}`); });
},
};
I also opened the inbound ports from windows firewall rules for ports 80, 443, 4000.
FireWall Rules Image
When I tried: http://localhost:4000/ -->it works.
When I tried: http://192.168.X.X:4000/ -->it didn't work.
The weird thing is that when I run the same setup on Linux "ubuntu" it works with the same code above "after opening the ports using: ufw allow 80,443,4000 proto tcp".
For debugging with cmd I tried:
netstat -a -o and I got that node is working in localhost:4000 rather than 0.0.0.0:4000
EX: TCP 127.0.0.1:4000 DESKTOP-T18TEC0:0 LISTENING 11628
How I can make it 0.0.0.0:4000 so I can access node.js server by device-network IP 192:168.X.X?
Ping my ip "192.168.X.X" and its pingable.

Node server not reachable from outside

I am playing with a small node server application.I have hosted it in AWS Lightsail's ubuntu instance. It is reachable from local browser like http://localhost:4201/
but when I try to access it from remote, it is unreachable.
In aws instance's network config I have opened traffic for all ports
I have cleared all rules from iptables as well. I am able to reach http port 80 and ping successfully. But no luck with node server, what am I missing? Is there a special way to enable traffic to node server?
I debugged it, basically in server.ts
I had bound it to localhost so it won't accept request from outside
app.listen(4201, '127.0.0.1', function () {
console.log('Server Listening on 0.0.0.0:4201');
});
changed it to 0.0.0.0
app.listen(4201, '0.0.0.0', function () {
console.log('Server Listening on 0.0.0.0:4201');
});
And now it is accessible from everywhere.

Unable to access localhost:3000 from other machine

I'm having a node.js application running on localhost:3000 and able to access it through my browser. I'm having the following configuration in my server.js file.
here port is 3000
app.listen(port, '0.0.0.0', function onStart(err) {
if (err) {
console.log(err);
}
console.info('==> 🌎 Listening on port %s. Open up http://localhost:%s/ in your browser.', port);
});
When I try to access my server using my laptop's IP by checking it through what's my ip on google e.g. ip is http://58.27.123.12:3000, it doesn't take me to the requested page. I'm running the application on Ubuntu 19.10.
I'm also able to ping my ip through other systems and it responds successfully. What I might be doing wrong? Thanks
if you want people to access on LAN give them your localIP with port number or if you want to provide access via internet check below links:-
https://localhost.run/
https://localtunnel.github.io/www/
ssh -R 80:localhost:3000 ssh.localhost.run
using this command solved the issue after installing localtunnel

This site can’t be reached on Nodejs Express?

I'm totally new to Node and I tried to run a test site on a hosting centos 7 (vultr.com). I've got nodejs, express installed.
Hello.js
const express = require('express')
const app = express()
app.get('/', function (req, res) {
res.send('Hello World!')
})
app.listen(3000, function () {
console.log('Example app listening on port 3000!')
})
run node hello.js
On my PC, http://x.x.x.x:3000/ => shows This site can’t be reached
x.x.x.x took too long to respond.
UPDATE:
I think you should consider about your server port. Have you open port 3000 in CentOS?
You can check your open port by typing
iptables -L
I think the firewall blocked your port you can open it by type this command
iptables -A INPUT -p tcp --dport 3000 -j ACCEPT
If you are using remote server, probably your 8080 port is blocked.
If you have root access and port 80 is open you can try and run script with sudo
But the first option is probably your problem
If you use the Google Cloud platform, you can open port 3000 at FIREWALL RULES in VPC network.
It works for me.

How to bind http server with express object to a specific ip address?

How do i bind a specific address to a http object? Currently the default ip address for node.js is 127.0.0.1 and I want to change it to 0.0.0.0
var express = require('express');
var app = express();
var http = require('http').Server(app);
http.listen(3000, "0.0.0.0");
How to achieve that?
edited: I added 0.0.0.0 but the default is still 127.0.0.1
0.0.0.0 is not an actual IP that you can reach. Although it means bind to all IPs, or any IP. So no wonder it works for 127.0.0.1. If you have set an IP address on one of your network devices (LAN, WiFi, virtual) it'll listen on those too.
In python you can simply type runserver 0.0.0.0 or something, so in Node.js is there an alternative?
process.argv gives you a list of arguments passed to node.
So if you run
node server.js 0.0.0.0
You'll get
process.argv[0] //=> "node"
process.argv[1] //=> "server.js"
process.argv[2] //=> "0.0.0.0"
Note that it's an array, so as long as you're sure you'll be running your file like that you can use process.argv[2] to specify that as the IP address you want to listen to.
http.listen(3000, process.argv[2]);
Generally though, you should set environment variable IP.
http.listen(3000, process.env[IP]);
Or all of them
http.listen(3000, process.argv[2] || process.env[IP] || "0.0.0.0");

Resources