2017-05-17 51 views
1

我正在通過AWS Elastic Beanstalk提供應用程序。 localhostngrok按預期提供網頁和其他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正確設置和路由。

+0

504的意思是「網關超時」,從而獲取傳遞到您的節點的應用程序已超時的請求。你可以添加代碼的一個路線是超時到你的問題? – robertklep

+0

已更新。除上述情況外,該路線在所有其他情況下均可正常工作。如果我將前端服務器和後端分離到單獨的服務器上,它甚至可以用於ELB。它現在只是從同一臺服務器上提供'index.html'而開始失敗。 –

+0

在我看來'ddb_calls.awsDynamoQuery'可能會導致超時。 – robertklep

回答

0

這就是問題所在:

app.use(express.static(__dirname + '/../web'),() => {}) 

我不知道你爲什麼還說,去年有功能,但它是一個(不完全)的中間件功能將停止所有的請求,因爲它沒有做任何事情。

它應該是這樣的:

app.use(express.static(__dirname + '/../web')) 
+0

賓果。就是這樣。不知道爲什麼我這樣做。謝謝您的幫助! –