我正在通過AWS Elastic Beanstalk提供應用程序。 localhost
和ngrok
按預期提供網頁和其他API調用。當上傳到AWS-ELB
時,504 error
是在提供網頁後對任何其他api調用的響應。當部署到AWS時,Express.js路由以504錯誤響應
應用經由服務於基index.html文件:
基本設置和SERVING INDEX.HTML
app.use(bodyParser.urlencoded({ extended: true }))
app.use(bodyParser.json())
app.all('/', ensureSecure)
function ensureSecure(req, res, next){
if(req.headers['x-forwarded-proto'] === 'https'){
// OK, continue
return next()
};
res.redirect('https://' + req.headers.host)
}
app.use(express.static(__dirname + '/../web'),() => {}) // SERVE THE WEBPAGE
var port = process.env.PORT || 443
var router = express.Router()
router.use(function(req, res, next) {
console.log('here')
res.setHeader("Access-Control-Allow-Methods", "POST, PUT, OPTIONS, DELETE, GET");
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next(); // make sure we go to the next routes and don't stop here
});
然後,它具有低於它附加路線:
後續API CALL
app.get('/user/:type', function(req, res) {
res.setHeader("Access-Control-Allow-Methods", "POST, PUT, OPTIONS, DELETE, GET");
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
var dbparams = {};
dbparams.TableName = 'FFUserTable';
dbparams.KeyConditionExpression = 'uid = :uid'
dbparams.ExpressionAttributeValues = {':uid':req.query.uid};
ddb_calls.awsDynamoQuery(dbparams, function(data){
res.json(data);
})
})
索引頁提供並渲染得很好。但是,當頁面調用它們時,它下面的任何路由都會返回504網關錯誤。奇怪的是,這隻有在部署到AWS-ELB時纔會發生。當使用localhost
或使用ngrok
時,一切都按預期工作。即使我拿出https
重定向,我也會遇到同樣的問題。
AWS-ELB ssl通過AWS-Route53正確設置和路由。
504的意思是「網關超時」,從而獲取傳遞到您的節點的應用程序已超時的請求。你可以添加代碼的一個路線是超時到你的問題? – robertklep
已更新。除上述情況外,該路線在所有其他情況下均可正常工作。如果我將前端服務器和後端分離到單獨的服務器上,它甚至可以用於ELB。它現在只是從同一臺服務器上提供'index.html'而開始失敗。 –
在我看來'ddb_calls.awsDynamoQuery'可能會導致超時。 – robertklep