簡體   English   中英

MarshalError:無法編組響應:JSONDecodeError AWS Lambda

[英]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。

https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/javav2/example_code/lambda/src/main/java/com/example/lambda/LambdaInvoke.java

要傳遞數據,請使用InvokeRequest object。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM