Node / Express challenges with shared hosting - node.js

I am trying to get a Node app working on A2 Shared hosting. Has anyone got any experience with getting node to work on A2 shared hosting?
My problem seems to be with Express - not even the simplest node test file runs, for example :-
const port = process.env.PORT || 80;
const express = require('express');
const app = express();
app.set('view engine', 'ejs');
app.get('/', function (req, res) {
res.send(`INDEX`);
});
app.get('/about', function (req, res) {
res.send(`ABOUT`);
});
app.listen(port);
console.log(`Listening on port ${port}`);
All I get is :-
Cannot GET /mysite1/
(where mysite1 is the name of the location / application I specified in the Node confirguration in the A2 Hosting control panel.
H

Related

Express.js route almost everything to one request

I want to map all the requests that don't point to static files to my index.html and let javascript do the routing. But if I use the rules below all my requests (including the scripts and styles) hit the * rule.
const express = require("express");
var app = express();
app.get("*", function (request, response) {
response.sendFile(path.join(__dirname, "/index.html"));
});
app.use("/scripts/*", express.static("scripts"));
app.use("/styles/*", express.static("styles"));
app.use("/views/*", express.static("views"));
var port = process.env.PORT || 3000;
app.listen(port, function () {
console.log("Server is running, port: " + port);
});
I've also tried the reverse order.
Just to clarify here are some examples of what the expected behavior is:
/scripts/index.js => /scripts/index.js
/views/app.html => /views/app.html
/anything/here => /index.html
/ => /index.html
/a/lot/of/stuff => /index.html
I want to upload this to heroku and I don't want to use that many free credits. So I want to have all the routing and stuff on the JS to save up on computation on the server.
app.use('/scripts', express.static('scripts'));
app.use('/styles', express.static('styles'));
app.use('/views', express.static('views'));
app.get('/', function (request, response) {
response.sendFile(express.static(path.join(__dirname, 'index.html'));
});
Try to use the code in this manner and I really hope this will work for you
Try this code.
Put all your files inside public folder (including index.html and other folders like script, styles, views)
const express = require('express')
const path = require('path')
const app = express()
const PORT = process.env.PORT || 3000
app.use(express.static(path.join(__dirname, '/public')))
app.get('*', (req, res) => {
res.redirect('/')
})
app.listen(PORT, () => console.log(`Server is running, port: ${PORT}`)
Your code will start working if you shift app.use functions to the top of your code

On Heroku web apps, how to redirect from users from .herokuapp.com to custom domain?

I am using NodeJS, specifically, I am using the tutorial code from node-js-getting-started. So I have a custom domain, but the default heroku domain is also active, and I would like to have the custom domain be the only one in use. Heroku said to do this.
Your app’s Heroku domain always remains active, even if you set up a custom domain. If you want users to use the custom domain exclusively, your app should send HTTP status 301 Moved Permanently to tell web browsers to use the custom domain. The Host HTTP request header field will show which domain the user is trying to access; send a redirect if that field is example.herokuapp.com.
I don't really understand how to do this. I'm guessing I have to change something in the index.js file.
const express = require('express')
const path = require('path')
const PORT = process.env.PORT || 5000
express()
.use(express.static(path.join(__dirname, 'public')))
.set('views', path.join(__dirname, 'views'))
.set('view engine', 'ejs')
.get('/', (req, res) => res.render('pages/index'))
.listen(PORT, () => console.log(`Listening on ${ PORT }`))
If the route is "/" or actually any route you should redirect it to your domain with code 301.
Try something like this.
var express = require('express')
var app = express()
self.app.all(/.*/, function(req, res, next) {
var host = req.header("host");
if (host.match(/^herokuapp\..*/i)) {
res.redirect(301, "http://www." + host + req.url);
} else {
next();
}
});

Why can't I view my home page like I can on a local host

I am trying to upload my website on digital ocean using express, node and react. I can view my website on localhost:3000 but when I run nodemon on the publicip:3000 all I see is /root/website/src/index.html displayed on the page. Here is the server.js file
const express = require('express');
const app = express();
//Set port
const PORT = process.env.PORT || 3000;
//Import path
const path = require('path');
//Static files
app.use(express.static('build'));
//Server will use index.html
app.get('/*', (req, res) => {
res.send(path.join(__dirname + '/src/index.html'));
});
app.listen(PORT, () => {
console.log('Listening on port ${PORT}');
});
If you are using res.send() then it will send the path of the file. And path.join should contain the values separated with commas as it takes the values as string array.
Try this
If you want the actual file to send.
res.sendFile(path.join(__dirname ,"src/index.html"));

Failed to lookup view "/landing.ejs" in views directory

I'm working in Cloud9 and when trying to run the application i'm greeted with the error failed to lookup view "/landing.ejs" in views directory:
Thus far I have:
var express = require("express");
var app = express();
app.get("/", function(req, res){
res.render("/landing.ejs");
})
app.listen(process.env.PORT, process.env.IP, function(){
console.log("Server is running");
})
My file tree is structed as such App > v1 > app.js package.json views > landing.ejs
At first,you have to set default view files path app.set('views', __dirname + '/view_files_folder_path'); after the line var app = express(); .
Then modify this res.render("/landing.ejs"); to res.render("landing.ejs");
Hope this will work :)

express.js how show image?

I have images in /public folder and I want to show them..simply like this: <img src="a.jpg">
My app.js code
var express = require('express')
, app = express()
, http = require('http')
, server = http.createServer(app)
, io = require('socket.io').listen(server);
server.listen(8080);
app.use('/public', express.static(__dirname + "/public"));
If I open it in localhost this error is still showing
NetworkError: 404 Not Found - http://localhost:8080/public/a.jpg"
in your case it is enough to write:
app.use(express.static('public'));
it will serve directly the public folder.
an image in this path /public/images/somePhoto.png would be shown like that: http://localhost:8080/images/somePhoto.png
source: https://expressjs.com/en/starter/static-files.html
You need to drop the /public/ bit from your URL to your image.
So it becomes just http://localhost:8080/a.jpg
handling static files in express
You simply need to pass the name of the directory where you keep your static assets, to the express.static middleware to start serving the files directly.
For example, if you keep your assests in a folder called public, you can use
app.use(express.static('public')) as follows, my images are in public\images
var express = require('express');
var app = express();
app.use(express.static('public'));
app.get('/', function (req, res) {
res.send('Hello World');
})
var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port
console.log("Example app listening at http://%s:%s", host, port)
})
save the code above to server.js
$ node server.js
Now open http://127.0.0.1:8081/images/logo.png in any browser and image will show up

Resources