AWS - Lambda 执行失败

AWS - Lambda execution fail

我对编码比较陌生。所以如果已经有 100 个帖子,我很抱歉。

我的问题如下:我只想使用 Lambda 和 Api 网关查询我的 DynamoDb。

不幸的是,我收到以下错误消息:

Tue May 18 11:58:37 UTC 2021 : Endpoint response body before transformations: {"errorType":"MultipleValidationErrors","errorMessage":"There were 4 validation errors:\n* MissingRequiredParameter: Missing required key 'TableName' in params\n* UnexpectedParameter: Unexpected key 'ExpressionAttributenames' found in params\n* UnexpectedParameter: Unexpected key 'ExpressionAttributValues' found in params\n* UnexpectedParameter: Unexpected key 'Tablename' found in params","trace":["MultipleValidationErrors: There were 4 validation errors:","* MissingRequiredParameter: Missing required key 'TableName' in params","* UnexpectedParameter: Unexpected key 'ExpressionAttributenames' found in params","* UnexpectedParameter: Unexpected key 'ExpressionAttributValues' found in params","* UnexpectedParameter: Unexpected key 'Tablename' found in params","    at ParamValidator.validate (/var/runtime/node_modules/aws-sdk/lib/param_validator.js:40:28)","    at Request.VALIDATE_PARAMETERS (/var/runtime/node_modules/aws-sdk/lib/event_listeners.js:132:42)","    at  [TRUNCATED]
Tue May 18 11:58:37 UTC 2021 : Lambda execution failed with status 200 due to customer function error: There were 4 validation errors:
* MissingRequiredParameter: Missing required key 'TableName' in params
* UnexpectedParameter: Unexpected key 'ExpressionAttributenames' found in params
* UnexpectedParameter: Unexpected key 'ExpressionAttributValues' found in params
* UnexpectedParameter: Unexpected key 'Tablename' found in params. Lambda request id: 99851ec8-e332-46e2-bd62-bb88626e15de
Tue May 18 11:58:37 UTC 2021 : Method completed with status: 502

这是 lambda 代码:

const AWS = require('aws-sdk');
exports.handler = async(event) => {

        var queryStringParameters = null;
        var statusCode = 500;
        var content = '';

        console.log(JSON.stringify(event));

        if (event.queryStringParameters != null) {
            queryStringParameters = event.queryStringParameters;
        }

        if (queryStringParameters != null) {
            var dynamodb = new AWS.DynamoDB();
            statusCode = 200;
        }
        if (queryStringParameters.country != null) {
            if (queryStringParameters.city != null) {
                console.log(queryStringParameters.country);

                // dynamo scan params aufbauen
                var params = {
                    ExpressionAttributenames: {
                        "#ID": "id",
                        "#FO": "form",
                        "#NA": "name",
                        "#LA": "langu",
                        "#CI": "city",
                        "#PO": "postcode",
                        "#EM": "email",
                        "#RE": "region",
                        "#TE": "telephone",
                        "#CO": "country"
                    },
                    ExpressionAttributValues: {
                        ":a": {
                            S: queryStringParameters.country
                        },
                            ":b": {
                                S: queryStringParameters.country
                            }
                        },
                        FilterExpression: "country = :a AND city = :b",
                        ProjectionExpression: "#ID, #FO, #NA, #LA, #CI, #PO, #EM, #RE, #TE, #CO",
                        Tablename: "customer"
                    };

                    console.log(JSON.stringify(params));
                    var dbResponse = await dynamodb.scan(params, function(err, data) {
                        if (err) {
                            console.log(err, err.stack);
                            content = 'Error';
                        }
                        else {
                            console.log(data);
                            content = data;
                        }
                    }).promise();
                }
            }

            const response = {
                statusCode: statusCode,
                body: JSON.stringify(content),
            };
            return response;
        };

我认为这只是 Lambda 函数中的一个小错误。谢谢!

精彩的开始!看起来有一些参数键不正确。错误消息清楚地指出 4...

  1. 参数中缺少必需的键 'TableName'。表名应重命名为 TableName。
  2. 在参数中发现意外键 'ExpressionAttributenames'。 ExpressionAttributenames 应重命名为 ExpressionAttributeNames。
  3. 在参数中发现意外键 'ExpressionAttributValues'。 ExpressionAttributValues 应重命名为 ExpressionAttributeValues。
  4. 在参数中发现意外键 'Tablename'。一旦你修复了数字 1,这应该会消失。

举个例子,我认为 param 对象应该看起来像这样...

var params = {
  ExpressionAttributeNames: {
    "#ID": "id",
    "#FO": "form",
    "#NA": "name",
    "#LA": "langu",
    "#CI": "city",
    "#PO": "postcode",
    "#EM": "email",
    "#RE": "region",
    "#TE": "telephone",
    "#CO": "country"
  },
  ExpressionAttributeValues: {
    ":a": {
      S: queryStringParameters.country
    },
    ":b": {
      S: queryStringParameters.country
    }
  },
  FilterExpression: "country = :a AND city = :b",
  ProjectionExpression: "#ID, #FO, #NA, #LA, #CI, #PO, #EM, #RE, #TE, #CO",
  TableName: "customer"
};