My app was working fine locally. When I deploy to Heroku I get 503 errors for the post routes. The GET routes seem to work fine as one of them is the route that is required to login using Google OAuth. The logout route is also a GET route and it works fine, as well. If anyone can tell me what I'm doing wrong I would be grateful. Here is my server code:
let express = require("express");
let cors= require("cors");
let mysql = require("mysql");
const util = require("util");
const keys = require("./config/keys");
const passport = require("passport");
const passportSetup = require("./config/passport-setup");
const bodyParser = require("body-parser");
const flash= require("connect-flash");
const path= require("path");
const cookieSession = require("cookie-session");
let app = express();
app.use(bodyParser.json());
app.use(express.static(__dirname));
app.use(cookieSession({
//below equals 2 hours
maxAge:120*60 * 1000,
// maxAge:5000,
keys:[keys.session.cookieKey],
httpOnly:false
}));
app.use(passport.initialize());
app.use(passport.session());
if (process.env.NODE_ENV === 'production') {
console.log("inside prod");
app.use(express.static(path.join(__dirname,'client/build')));
}
console.log("1");
let connection = keys.connection;
//this prevents the database connection from closing
//by querying this meaningless query every five seconds
setInterval(()=>{
connection.query("SELECT 1");
}, 5000);
console.log("connection");
console.log(connection)
app.get("/google", passport.authenticate("google",{
scope:['profile'],
failureFlash:"failure"
}),(req,res)=>{
// console.log(req.flash());
console.log("/google route");
});
//callback route for google to redirect to
app.get("/auth/google/redirect", passport.authenticate("google"), (req,res)=>{
console.log("isinde redirect");
console.log(req.user)
res.redirect("myurl.com?token="+req.user.token);
});
app.get("/logoutExp",(req,res)=>{
console.log("logout");
req.session=null;
req.logout();
res.redirect("/");
})
app.post("/addExercise", (request, res)=>{
console.log(request.body);
let workoutId = request.body.exObj.workoutId; //this comes from the request body;
let numberOfSets = request.body.exObj.numSets;
let maxReps = request.body.exObj.maxReps;
let exerciseName = request.body.exObj.exerciseName;
let weight = request.body.exObj.weight
addExercise(connection, workoutId, exerciseName, weight).then(results=>{
let exerciseId = results.insertId;
// response.send(exerciseId);
return addSets(connection, exerciseId, numberOfSets, maxReps)
}).then(response=>{
return getWorkout(connection, workoutId)
}).then(response=>{
res.send(response);
}).catch(err=>{
console.log(err);
})
})
app.post("/retrieveHistory", (req,res)=>{
console.log(req.session);
if(req.session.passport.user.token === req.body.token){
let userId = req.session.passport.user.userId;
console.log(userId);
workoutHistory(connection, userId).then(response=>{
let arr=[];
for(let i=0; i<response.length; i++){
arr[i]=response[i].workoutId;
}
// console.log(arr);
if(response.length ===0){
res.send("0");
}
// console.log("inside workouthistory then");
// console.log(arr);
return getExercisesInWorkout(connection, arr).then(response=>{
// console.log("inside wh geiw");
// console.log(response);
return getWorkout(connection, arr).then(response=>{
// console.log("sldkfjhasldj")
res.send(response);
})
})
}).catch(err=>{
console.log(err);
})
} else {
res.send("not logged in anymore");
}
})
//this route retrieves the ongoing incomplete workout if one exists
app.post("/retrieveCurrent", (req, res)=>{
let globalRes = res;
if(req.session.passport.user.token === req.body.token ){
let userId = req.session.passport.user.userId;
// console.log(userId);
//checking to see if any incomplete workouts exist, if one does, it will be retrieved.
//if not, one will be created
checkForIncompleteWorkout(connection, userId).then(response=>{
// console.log("inside checkForIncompleteWorkout")
// console.log(response.length);
if(response.length < 1){
res.send(response);
} else{
let workoutId = response[0].workoutId;
getWorkout(connection, workoutId).then(response=>{
// console.log("inside else gw");
// console.log(response);
res.send(response[0]);
}).catch(err=>{
console.log(err)
});
}
}).catch(err=>{console.log(err)})
} else {
}
// res.send(req.session.user);
})
app.post("/makeNewWorkout", (req,res)=>{
if(req.session.passport.user.token === req.body.token ){
let userId = req.session.passport.user.userId;
//creating new workout
makeNewWorkout(connection,userId).then(response=>{
// console.log("inside mnw");
// console.log(response);
//retrieving new workout to send back to client
return getWorkout(connection, response.insertId)
}).then(response=>{
res.send(response[0])
})
}
})
app.post("/completeWorkout", (req,res)=>{
if(req.session.passport.user.token === req.body.token ){
let workoutId = req.body.workoutId;
// console.log(workoutId);
completeWorkout(connection, workoutId).then(response=>{
res.send(response);
}).catch(err=>{
res.send(err);
})
}
})
app.post("/addRep", (req,res)=>{
if(req.session.passport.user.token === req.body.token ){
let setId = req.body.setId;
let workoutId = req.body.workoutId;
// console.log(workoutId);
addRep(connection, setId).then(response=>{
return getWorkout(connection, workoutId).then(response=>{
res.send(response);
});
// return getExercisesInWorkout(connection, )
}).catch(error=>{
res.send(error);
})
}
})
app.post("/notesHandler", (req,res)=>{
if(req.session.passport.user.token === req.body.token ){
let workoutId = req.body.workoutId;
let notes = req.body.notes;
notesHandler(connection, workoutId, notes).then(response=>{
return getWorkout(connection, workoutId).then(response=>{
res.send(response);
})
}).catch(err=>{
res.send(err);
})
}
})
// if (process.env.NODE_ENV === 'production') {
// app.use(express.static(path.join(__dirname, 'client','build')));
// }
function getIdOfMostRecentWorkout(connection, userId){
return new Promise((resolve,reject)=>{
connection.query("SELECT workoutId FROM workouts WHERE userId =? ORDER BY workoutDate DESC LIMIT 1", userId,(error,results)=>{
if(error)reject(error);
resolve(results);
})
})
}
function checkIfWorkoutExists(connection, workoutId){
return new Promise((resolve,reject)=>{
connection.query("SELECT COUNT(*) AS exist FROM workouts WHERE workoutId = ?",workoutId,(error,results)=>{
if(error) reject(error);
resolve(results);
})
})
}
const port = process.env.PORT || 4000;
let http = require("http");
let server = http.createServer(app,(req,res)=>{
res.writeHead(200, {"Access-Control-Allow-Origiin": "*"})
});
app.get("/service-worker.js", (req, res) => {
console.log("service workerssssss");
res.sendFile(path.join(__dirname + "app/client","build", "service-worker.js"));
});
app.get('/*', (req, res) => {
console.log("catchallll");
console.log(req.hostname);
console.log(req.path);
console.log(path.join(__dirname + '/client', 'build', 'index.html'));
res.sendFile(path.join(__dirname + '/client', 'build', 'index.html'));
})
server.listen(port, ()=>{
console.log("Listening on "+ port)
});
Here is some stuff from the logs. Below is the error from one of the POST routes (all POST routes give the same error):
2019-02-05T23:22:46.076348+00:00 heroku[router]: at=error code=H12
desc="Request timeout" method=POST path="/retrieveCurrent" host=*myurl* request_id=bbcd3e11-2e99-4321-b519-1635a282edcb
fwd="107.223.198.1" dyno=web.1 connect=1ms service=30001ms status=503 bytes=0
protocol=https
Here is the log for one of the GET routes(all GET routes give the same message):
2019-02-05T23:22:46.273636+00:00 heroku[router]: at=info method=GET
path="/logoutExp" host=*myurl* request_id=9833444b-e6a1-4771-a325-5be0d3788c2c
fwd="107.223.198.1" dyno=web.1 connect=1ms service=3ms status=302 bytes=381
protocol=https