2017-07-09 74 views
0

我對API網關和Lambda非常陌生。我正試圖將一個基於Node.js Express的API部署到lambda。我正在使用awslabs的aws-serverless-express example。因此,我的許多AWS配置都是爲我自動創建的。AWS API網關選項請求返回500錯誤

看來我的API通過API網關正常工作。我的帖子和獲取方法工作正常。但是,我需要支持CORS。我的應用程序應該將正確的CORS響應返回給OPTIONS請求,但它不適用於AWS。

最終,無論我做什麼,我都會收到對選項請求的500響應。我一直無法弄清楚如何獲得有關這500個錯誤的任何信息。我不確定是什麼原因造成的。

這是500響應的主體{"message": "Internal server error"}

這些是響應頭:

內容長度:36

內容類型:application/JSON

日期:太陽,2017年7月9日17點56分24秒GMT

狀態:500

通過:1.1 9af17e5a616bfc9ac07fc7e415ade9e6.cloudfront.net(CloudFront的)

X-AMZ-CF-ID:1_AZmkLqf1rjkog2MRtvcBAe54aIZdPWmNApBTwG48Af-v_g9WHkZw ==

X-AMZN-的requestId:ec216a62-64cf-11E7-ad2b-4f1e96508dba

X-緩存:從CloudFront的錯誤

我很確定我的OPTIONS請求甚至沒有進入Lambda上的應用程序。

我已經嘗試使用API​​網關(和我的應用程序)配置CORS。我正在嘗試將其配置爲允許所有來源。

如果有什麼我可以看或做的調試這個問題?

編輯:

在試圖調試這個問題我想啓用日誌記錄中的CloudWatch爲API網關。

CloudWatch configuration for the API Gateway

這樣做之後,我的CloudWatch看到這兩個網關看着的日誌:

enter image description here

我一直在使用刺,所以我點擊該鏈接,看看這個:

enter image description here

我想這是日誌條目的一個長長的清單。我不確定在這種情況下「流」是什麼意思。有數百個這樣的條目。所以,我選擇了最新的時間戳並點擊它。現在我看到這一點:

enter image description here

看來,我所有的網關的日誌看起來是這樣。 IE:顯然是空的。

那麼,我的設置是否正確?我在正確的地方看嗎?

+0

什麼是在500的身上錯誤? –

+0

正文中的唯一內容是:{「message」:「內部服務器錯誤」} –

+0

我已經使用我從Chrome中取得的一些細節更新了該問題。 –

回答

0

我剛剛通過這個......隱藏在AWS lambda文檔中,關於啓用CORS的事實是您必須在您的lambda中設置CORS頭。因此,這裏是如何做到這一點:

let payload = { 
    statusCode: 400, 
    body: JSON.stringify('body'), 
    headers: {"Access-Control-Allow-Origin": "*"} // NEED this for API CORS access 
}; 
callback(null, payload); 

您必須返回一個有效的StatusCode和身體標題一起,或API將無法改變你的拉姆達響應API響應。

+0

不幸的是,我已經得到了(我認爲)在JavaScript中已經是平等的了:app.use( cors({0}){0'}''' }) ); –

+0

我也手動完成了這個工作,不使用Cors庫,即使我手動實現了一個OPTIONS端點,我在lambda日誌中也看不到任何東西。 –

+0

不一樣。這是javascript,忽略IRepsonsePayload,這只是TypeScript的輸入。您必須將標題傳回:headers:{「Access-Control-Allow-Origin」:「*」} –

0

您可以使用下面的代碼在你的路由索引文件

app.options(function(req,res){res.send(200);}) 

這裏應用程序是express.This的路由器對象將發送所有的選項請求200

+0

我刪除了我對cors軟件包的使用,並添加了這個效果。我可以顯示獲取/發佈請求使其到我的API,但我不認爲選項請求是://使所有選項請求返回200 app.options('*',(req,res)=> ('Access-Control-Allow-Origin','*'); res.sendStatus(200); }); –