首页 > 解决方案 > POST 路由的 React Express Heroku 503 错误

问题描述

我的应用程序在本地运行良好。当我部署到 Heroku 时,发布路线出现 503 错误。GET 路由似乎工作正常,因为其中之一是使用 Google OAuth 登录所需的路由。注销路由也是一个 GET 路由,它也可以正常工作。如果有人能告诉我我做错了什么,我将不胜感激。这是我的服务器代码:

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)
});

这是日志中的一些内容。以下是来自 POST 路由之一的错误(所有 POST 路由都给出相同的错误):

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

这是其中一条 GET 路由的日志(所有 GET 路由都给出相同的消息):

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  

标签: mysqlreactjsexpressherokucleardb

解决方案


问题是我的数据库。我在本地添加了一些列,而没有更新 heroku 服务器上数据库中的表。这就是它超时的原因。谢谢。


推荐阅读