I have just put my node.js app in a local server in order to host it, so some users will be able to use it and I am having the following issue:
Everything works fine when I run the app, even after some minutes it keeps working well. However, if I leave it running for some some days, it stops working and I get this error. For instance, I ran it the last friday and today (Monday) I have seen this error when I connected remotelly to the server.
This is my server file:
const express = require('express');
const bodyParser = require("body-parser");
const crypto = require('crypto');
var session = require('express-session');
const internalIp = require('internal-ip');
const getPrices = require('./scrapers/getPrices.js');
const dbConnection = require('./dbConnection.js');
const app = express();
app.use('/assets', express.static('./assets/'));
const localIP = internalIp.v4.sync();
var hotelNames = [];
var urlsHotels = [];
var usersList = [];
var userInfo = new Object();
userInfo.id = undefined;
userInfo.role = 0;
app.use(session({
secret: 'secret',
resave: true,
saveUninitialized: true
}));
app.get('/', function (req, res) {
if (req.session.loggedin && userInfo.role == 0) {
getHotelsdata(res);
} else if (req.session.loggedin && userInfo.role == 1) {
loadAdminPage(res);
} else {
res.redirect('/login');
}
});
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.get('/login',function(req,res){
globalRes = res
//res.sendFile(__dirname + "/views/login.html");
res.render('./login.ejs', {
'localIP':localIP,
});
});
app.post('/submitlogin',function(req,res){
const password = crypto.createHash('sha256').update(req.body.password).digest('hex');
const users = new Promise((resolve, reject) => {
dbConnection
.getUsers()
.then(data => {
resolve(data)
})
});
Promise.all([users])
.then(data => {
usersList = data[0];
var loginSuccess = "0";
for(var i = 0; i < data[0].length; i++) {
if(data[0][i][1] == req.body.user && data[0][i][2] == password) {
req.session.loggedin = true;
req.session.username = req.body.user;
loginSuccess = "1";
userInfo.id = data[0][i][0];
userInfo.role = data[0][i][3];
}
}
res.end(loginSuccess);
});
});
app.post('/deleteUser', function(req, res) {
const deleteUser = new Promise((resolve, reject) => {
dbConnection
.deleteUser(req.body.user)
.then(data => {
resolve(data)
response = data[0];
})
});
Promise.all([deleteUser])
.then(data=> {
getUsersData(res, response);
});
})
app.post('/changePwd', function(req, res) {
const currentPassword = crypto.createHash('sha256').update(req.body.currentPassword).digest('hex');
const newPassword = crypto.createHash('sha256').update(req.body.newPassword).digest('hex');
const changePwd = new Promise((resolve, reject) => {
dbConnection
.changePwd(currentPassword, newPassword)
.then(data => {
resolve(data)
response = data[0];
})
});
Promise.all([changePwd])
.then(data=> {
res.end(data[0]);
});
})
app.post('/addUser', function(req, res) {
const password = crypto.createHash('sha256').update(req.body.password).digest('hex');
var response;
const insertUser = new Promise((resolve, reject) => {
dbConnection
.registerUser(req.body.user, password)
.then(data => {
resolve(data)
response = data;
})
});
Promise.all([insertUser])
.then(data => {
getUsersData(res, response);
});
});
app.get('/compare/:visitDay&:visitMonth&:visitYear&:leavingDay&:leavingMonth&:leavingYear', async function(req, res, next) {
if (req.session.loggedin) {
var results = new Array();
const date1 = new Date(req.params.visitMonth + '-' + req.params.visitDay + '-' + req.params.visitYear);
const date2 = new Date(req.params.leavingMonth + '-' + req.params.leavingDay + '-' + req.params.leavingYear);
const timeDiff = Math.abs(date2.getTime() - date1.getTime());
const nights = Math.ceil(timeDiff / (1000 * 3600 * 24));
assignurls(req.params.visitYear, req.params.visitMonth, req.params.visitDay, req.params.leavingYear, req.params.leavingMonth, req.params.leavingDay);
const getPrices = new Promise((resolve, reject) => {
getPrices
.getPrices(results, nights, urlsHotels)
.then(data => {
resolve(data)
})
});
Promise.all([getPrices])
.then(data => {
loadPage(res, JSON.stringify(hotelNames), JSON.stringify(results), req.params.visitDay + "/" + req.params.visitMonth + "/" + req.params.visitYear, req.params.leavingDay + "/" + req.params.leavingMonth + "/" + req.params.leavingYear);
});
} else {
res.redirect('/login');
}
});
app.get('/addHotel&:url&:name', function(req, res, next) {
if (req.session.loggedin) {
let url = req.params.url.split('');
url.splice(44, 3);
url[44] = 'visitYear';
url.splice(46, 1);
url[46] = 'visitMonth';
url.splice(48, 1);
url[48] = 'visitDay';
url.splice(70, 3);
url[70] = 'leavingYear';
url.splice(72, 1);
url[72] = 'leavingMonth';
url.splice(74, 1);
url[74] = 'leavingDay';
url = url.join('');
const insertHotel = new Promise((resolve, reject) => {
dbConnection
.insertValues(hotelNames, url, req.params.name, userInfo.id)
.then(data => {
resolve(data)
})
});
Promise.all([insertHotel])
.then(data => {
getHotelsdata(res, data);
});
} else {
res.redirect('/login');
}
});
app.get('/deleteHotel&:name', function(req, res, next) {
if (req.session.loggedin) {
const deleteHotel = new Promise((resolve, reject) => {
dbConnection
.deleteValues(req.params.name)
.then(data => {
resolve(data)
})
});
Promise.all([deleteHotel])
.then(data => {
getHotelsdata(res, data);
});
} else {
res.redirect('/login');
}
});
app.get('/logout', function(req, res, next) {
req.session.loggedin = false;
res.redirect('/');
});
function assignurls(visitYear, visitMonth, visitDay, leavingYear, leavingMonth, leavingDay) {
for(var i = 0; i<urlsHotels.length; i++) {
var finalurl = urlsHotels[i].replace('visitYear', visitYear);
finalurl = finalurl.replace('visitMonth', visitMonth);
finalurl = finalurl.replace('visitDay', visitDay);
finalurl = finalurl.replace('leavingYear', leavingYear);
finalurl = finalurl.replace('leavingMonth', leavingMonth);
finalurl = finalurl.replace('leavingDay', leavingDay);
urlsHotels[i] = finalurl;
}
}
function getUsersData(res, response) {
const users = new Promise((resolve, reject) => {
dbConnection
.getUsers()
.then(data => {
resolve(data);
})
});
Promise.all([users])
.then(data => {
usersList = data[0];
res.end(response);
});
}
function getHotelsdata(res, results) {
const getNotelNames = new Promise((resolve, reject) => {
dbConnection
.getHotelNames(userInfo.id)
.then(data => {
resolve(data)
})
});
const getURLs = new Promise((resolve, reject) => {
dbConnection
.getURLs(userInfo.id)
.then(data => {
resolve(data)
})
});
Promise.all([getNotelNames, getURLs])
.then(data => {
hotelNames = data[0];
urlsHotels = data[1];
loadPage(res, JSON.stringify(hotelNames), JSON.stringify([results]));
});
}
function loadPage(res, param1, param2, param3, param4) {
res.render('./comparatorPage.ejs', {
'hotelNames':param1,
'results': param2,
'checkInDate': param3,
'checkOutDate': param4,
'localIP': localIP,
});
}
function loadAdminPage(res) {
res.render('./adminPage.ejs', {
'usersList': JSON.stringify(usersList),
'localIP': localIP
});
}
app.listen(process.env.PORT || 3000);
That is the error I get:
As I said, everything works fine until it is running during some days.
How can I solve this? Node.js is a sever-side language, so this should not be happening.
Thank you in advance.
Additional info: I use Windows Server 2008 R2 Standard.