2016-09-19 30 views
0

我有一個簡單的Lambda函數,它將項目寫入DynamoDB表。 用戶名是分區鍵,createDateTime是排序鍵。AWS Lambda函數返回來自API網關的錯誤,但不是直接調用時發生的錯誤

從Lambda本身調用此函數可成功將項插入表中。通過API網關稱爲然而,當,我收到以下錯誤

{ 
    "errorMessage": "Error putting order into dynamodb: MultipleValidationErrors: There were 14 validation errors:\n* InvalidParameterType: Expected params.Item['createDateTime'] to be a structure\n* UnexpectedParameter: Unexpected key '0' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '1' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '2' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '3' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '4' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '5' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '6' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '7' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '8' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '9' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '10' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '11' found in params.Item['createDateTime']\n* UnexpectedParameter: Unexpected key '12' found in params.Item['createDateTime']" 
} 

我不明白爲什麼當本地調用我的代碼工作,而不是在通過API調用網關?代碼如下:

var AWS = require("aws-sdk"); 
var DOC = require("dynamodb-doc"); 

AWS.config.update({region: "eu-west-1"}); 
var dynamodb = new DOC.DynamoDB(); 

exports.handler = function(event, context) { 
    console.log('Received event:', JSON.stringify(event, null, 2)); 

    var tableName = "MarketOrder"; 

    if (event.http_method == 'POST') { 
     var datetime = new Date().getTime().toString(); 

     dynamodb.putItem({ 
      "TableName": tableName, 
      "Item" : { 
       "username" : event.username, 
       "createDateTime" : datetime, 
       "orderType": event.orderType, 
       "numberOfShares": event.numberOfShares, 
       "price": event.price, 
       "validToDate": event.validToDate 
      } 
     }, function(err, data) { 
      if (err) { 
       console.log("dynamodb error: " + err); 
       context.done('Error putting order into dynamodb: ' +err); 
      } 
      else { 
       console.log('great success: '+JSON.stringify(data, null, ' ')); 
       context.succeed('Sucessfully saved market order'); 
      } 
     }); 
    } 
    .... 
    } else { 
     context.fail('Invalid operation specified:' + event.http_method); 
    } 
}; 
+0

「我不明白爲什麼當本地調用,而不是在通過API調用網關我的代碼工作?」很顯然API Gateway傳遞的事件數據與您直接測試的事件數據不同。我看到你在你的函數的第一行記錄事件對象。嘗試比較直接調用與API網關調用的日誌,然後您應該看到問題所在。您可能需要修改您的API網關映射模板。 –

回答

1

您的映射模板很可能存在問題。我建議打開CloudWatch日誌記錄以查找API以進行故障排除。

https://rpgreen.wordpress.com/2016/08/30/easy-api-gatewaylambda-serverless-api-loggingdebugging/

+0

謝謝,映射是問題。所以實際問題解決了。然而,它會很好,讓你鏈接到工作以及btu,我得到「ClientError:調用FilterLogEvents操作時發生錯誤(ResourceNotFoundException):指定的日誌組不存在。」當用python -m apilogs.bin調用時--api-id - stage prod --watch。任何指針? – Daniel

+0

您需要確保爲您的API啓用了日誌記錄功能。我剛剛更新了該工具,以生成更好的錯誤消息並鏈接到文檔。 http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-stage-settings.html –

+0

啓用日誌記錄功能後,我可以在CloudWatch中查看實際日誌。日誌組名爲「API-Gateway-Execution-Logs_ /」。也許我想知道--api-id之後應該放什麼? – Daniel

相關問題