[英]MarshalError: Unable to marshal response: JSONDecodeError AWS Lambda
我在 AWS 中編寫了lambda
function ,它從 Dynamo DB 中獲取數據並以 JSON 格式返回。 它采用格式 - {"Datestamp":"2021-01-11"}
的請求輸入正文並返回此日期的報告。
我使用 java 腳本從 web 頁面調用它,但我收到“無法編組響應”錯誤。
Javascript 代碼 -
$.ajax({
type : "POST",
contentType : "application/json",
url : "https://mypoc-app.com/api/",
data:
{
"Datestamp" : "2021-02-15"
},
headers: {
'Authorization': 'Basic',
'Access-Control-Allow-Origin': '*',
'Content-Type': 'application/json',
'Access-Control-Allow-Methods': 'DELETE, POST, GET, OPTIONS',
'Access-Control-Allow-Credentials' : true
//'Access-Control-Allow-Headers': 'Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With',
},
dataType : "json",
success : function(data,status) {
console.log("Date format is " + data);
if (response != null)
{
drawTable(response.data);
}
},
error: function () {
console.log("Error");
}
});
Lambda function -
def lambda_handler(event, context):
try:
result = []
queryresponse = resultstable.scan()
for i in queryresponse['Items']:
result.append(i['reports'])
block=['{"type": "section","text": {"type": "mrkdwn","text": "*Found below reports using Datestamp provided*"}}']
for item in result:
print(event["body"])
body = json.loads(event["body"])
if item.find(body['Datestamp']) != -1:
itema='{"type": "section","text": {"type": "mrkdwn","text": "<https://%s/%s/%s/index.html|%s>"}}' % (URL,Prefix,item,item)
block.append(itema)
block=('[{}]'.format(', '.join(block)))
return {
'statusCode': 200,
'headers': {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*'
},
'body': block,
"isBase64Encoded": False
}
except Exception as e:
print(e)
return(e)
Cloudwatch 中的錯誤日志 -
START RequestId: XXXXXXXXXXXXXXXXXXXX Version: $LATEST
Datestamp=2021-02-15
Expecting value: line 1 column 1 (char 0)
[ERROR] Runtime.MarshalError: Unable to marshal response: JSONDecodeError('Expecting value: line 1 column 1 (char 0)') is not JSON serializable
END XXXXXXXXXXXXXXXXXXXX
我相信這與我在請求中傳遞日期的方式或 lambda 處理它的方式有關,因為從雲觀察日志來看,它看起來不像是 JSON 格式。
有人可以在這種情況下提供他們的專業知識嗎,因為我已經摸不着頭腦了?
正如您所說,它在控制台上運行良好 - 我懷疑您的問題是嘗試使用 AJAX 調用它。 更好的方法是將AWS SDK 用於 JavaScript 。 使用 Lambda 客戶端 API 從腳本標簽內調用 Lambda function。
以下是 Lambda 的 JS API 的示例:
https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javascriptv3/example_code/lambda
要調用 Lambda function,您可以調用調用操作。 請參閱此 Java 示例。 將此示例移植到 JS API。
要傳遞數據,請使用InvokeRequest object。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.