我通过AWS Elastic Beanstalk提供应用程序。 localhost
和ngrok
按预期提供网页和其他API呼叫。上传到AWS-ELB
后,504 error
是在网页投放后对任何其他API调用的响应。
该应用程序通过以下方式提供基本index.html文件:
基本设置和服务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
});
然后它下面还有其他路线:
SUBSEQUENT 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 :(得分:0)
这是问题所在:
app.use(express.static(__dirname + '/../web'), () => {})
我不确定你为什么在那里添加了最后一个功能,但它是一个(不完整的)中间件功能,它会阻止所有请求,因为它没有做任何事情。
应该是这样的:
app.use(express.static(__dirname + '/../web'))