I am trying to deploy node.js on AWS ec2
I followed this tutorial and that my code
const express = require('express') ;
const app = express();
const port = process.env.PORT || 3000 ;
app.get('/', (req , res) =>{
res.send('Connected');
});
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`);
});
and when I start it gives me the
Example app listening at http://localhost:3000
but when I try to reach it from the browser I can't reach it
any idea what can I do or where to look ??
You need to configure inbound and outbound rules in the instance's security group.
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/authorizing-access-to-an-instance.html
I am assuming you have already followed the guide you mentioned and added the necessary security group rules to allow the incoming traffic on port 3000.
Your app should be listening on all the interfaces or on the IP address of your ec2 instance instead of localhost. localhost resolves to 127.0.0.1 which is a loopback interface that is not accessible over the internet.
documentation
[app.listen([port[, host[, backlog]]][, callback])]
const express = require('express') ;
const app = express();
const port = process.env.PORT || 3000 ;
app.get('/', (req , res) =>{
res.send('Connected');
});
app.listen(port, '0.0.0.0',() => {
console.log(`Example app listening at http://localhost:${port}`);
});
Related
I have centos 6 running nodejs 10,
and i have this scaffold code to test my application server but still giving Error: connect ECONNREFUSED ip:4000
const express = require('express')
const app = express()
const port = 3432
const https = require('https');
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
When i try to put the url in the browser it says This site can’t be reached.
I like server is not running but it is running.
The error was that server administrator dont enable the port for me
This question already has answers here:
Containerized Node server inaccessible with server.listen(port, '127.0.0.1')
(2 answers)
Closed 8 months ago.
I am building container with node.
I have two type of codes. I think two codes very simple and similar. and package.json and Dockerfile is same. just different code.
but I can connect app in container. but the other one can't connect app in container.
This code is working well in container.
const express = require('express')
const PORT = 3000;
const app = express();
app.get('/',(req,res)=>{
res.send('Hello World');
});
app.listen(PORT);
console.log('Running');
but This code is not working What wrong with this? this is node official sample code.
const http = require('http');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
please tell me what problem is.
Thank you in advance
The sample code works when run on the host machine, but not when run in a container.
The issue is that the sample code binds to the 127.0.0.1 IP address. That means that it'll only accept connections from localhost.
In a container, localhost is the container itself. So when you try to connect from the docker host, it looks like the connection comes from another machine and the connection is rejected.
To fix it, you need to make it accept connections from outside the container. You can do that by changing the hostname variable to 0.0.0.0 like this
const http = require('http');
const hostname = '0.0.0.0';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
You can also leave out the hostname variable on the server.listen call as you've done in the first program. The default value is 0.0.0.0, so leaving it out also works.
I am trying to build a full stack app using ReactJS for the frontend and ExpressJS for the backend. I use Axios to make calls from my frontend to my backend. When I make those calls, I get these errors:
My express index file:
const express = require('express')
const path = require('path')
var app = express()
const PORT = process.env.PORT || 5000
app.listen(PORT, () => {
console.log(`Server started on port ${PORT}`)
})
app.use(express.static(path.join(__dirname, "public")))
My get call from React frontend:
componentDidMount() {
axios.get("http://localhost:5000/servers.json").then((res => {
this.setState({ servers: res.data })
}))
}
React server is running on port 3000 and Express server is running port 5000, so there shouldn't be a conflict there...
The reason you are getting the error http://localhost:3000 is not allowed by Access-Control-Allow-Origin is because of the same origin policy, a security feature that's restricting your react script from accessing/communicating your server since they are from different origins. Please note that for documents or scripts to be considered as having the same origin they need to have the same protocol (e.g http / https), hostname (e.g localhost / www.my-server.com) and port. In your case port the react script runs at port 3000 while the express script is running on port 5000, thus the error.
To solve this, you need to enable CORS - Cross Origin Resource Sharing on your server side code. First install the cors dependency using the command
npm install cors
Then update the code in your server to look as follows:
const express = require('express')
const path = require('path')
const cors = require('cors')
const app = express()
app.use(cors())
const PORT = process.env.PORT || 5000
app.listen(PORT, () => {
console.log(`Server started on port ${PORT}`)
})
app.use(express.static(path.join(__dirname, "public")))
Hopefully this works for you.
This looks like a basic cors issue. Add this cors middleware to your express server. It's the state of the art solution to this problem.
const express = require('express')
const path = require('path')
var cors = require('cors')
var app = express()
app.use(cors())
const PORT = process.env.PORT || 5000
app.listen(PORT, () => {
console.log(`Server started on port ${PORT}`)
})
app.use(express.static(path.join(__dirname, "public")))
If you are interested about cors in general, check out the wikipedia page.
I have an express server setup online which loads multiple ports and those ports are setup on subdomains for example. port 9000 loads the main domain.com port 8000 loads the main application at "app.domain.com" port 1000 loads "signup.domain.com" and the build version of the app is on port 8500 "build.domain.com".
The application is an Angular application however when I go to load the Angular app it loads on port 4200 or it says 8500 is in use. So currently I am loading that in express like so:
// Build Application - In Development
var appbuild = express();
appbuild.get('/', function (req, res){
res.sendFile('/app/build/myapp/src/index.html', { root: '.' })
});
var port = 8500;
appbuild.listen(port);
console.log('Build App Listening on port', port);
So my question is in Express how can I instead of writing sendfile command make it launch the angular app in that location on port 8500 so my subdomain names will work. The reason I'm asking this is because right now all it does is load the index file but angular or the app isn't running so i just see source code that says app-root and a blank white page.
Thank you in advance.
Robert
--- Update. I've decided to post the entire Express file. My issue is trying to load a angular app on port 8500 from the subfolder upon booting of express. Here is the full server.js code:
// server.js
const express = require('express'),
path = require('path'),
bodyParser = require('body-parser'),
cors = require('cors'),
mongoose = require('mongoose'),
config = require('../config/DB');
mongoose.Promise = global.Promise;
mongoose.connect(config.DB).then(
() => {console.log('Database is connected') },
err => { console.log('Can not connect to the database'+ err)}
);
// Main Website
var web = express();
web.get('/', function (req, res){
res.sendFile('/web/index.html', { root: '.' })
});
var port = 9000;
web.listen(port);
console.log('Web Listening on port', port);
// Main Application
var app = express();
app.get('/', function (req, res){
res.sendFile('/app/index.html', { root: '.' })
});
var port = 8000;
app.listen(port);
console.log('Main App Listening on port', port);
// Build Application - In Development
var appbuild = express();
appbuild.get('/', function (req, res){
res.sendFile('/app/build/myapp/src/index.html', { root: '.' })
});
var port = 8500;
appbuild.listen(port);
console.log('Build App Listening on port', port);
// Sign up Portal
var sign = express();
sign.get('/', function (req, res){
res.sendFile('/signup/index.html', { root: '.' })
});
var port = 10000;
sign.listen(port);
console.log('Sign Up Portal Listening on port', port);
Refer to this link https://malcoded.com/posts/angular-backend-express
Update your code to the following:
const express = require('express');
const app = express();
app.listen(8500, () => {
console.log('Server started!');
});
You need to build the angular app if your angular version not 1.x
ng build
Also, I think this question is similar to your question:
Not able to view Angular app via express/heroku?
i'm developing a REST API with node js on linux.
This my first sample code to try if all works fine:
'use strict';
var express = require("express");
var app = express();
var port = process.env.PORT || 8080 ;
app.listen(port, "127.0.0.1", function(){
console.log("Express server is listening on port ", port);
});
i have try to call localhost:8080 into linux server and works fine.
If i try to call trhe IP of server with this port by a external IP the express server not responding.
Any help about this?
Thanks
Your second parameter to the app.listen() api, which you set to "127.0.0.1" is the hostname. This will cause node to only listen for requests matching that host name from the request domain.
This is an optional parameter.
Perhaps try the app.listen(port, callback) form of the api?
app.listen(port, function () {
console.log("Express server is listening on port ", port);
});
app.get('/', function (req, res) {
res.send('Hello world!')
});
Or you can move the [hostname] parameter to a configuration file if you don't want your service to listen to every host name.
See the server.listen() documentation for better insight into parameter default behaviour.
Try this so your app listens on all network interfaces and not only on localhost:
app.listen(port, "0.0.0.0", function(){
console.log("Express server is listening on port ", port);
});