0

i'm relatively new to coding. So I'm sorry if there are already 100 posts from this.

My problem is the following: I want to simply query my DynamoDb using Lambda and Api Gateway.

Unfortunately I get the following error message:

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

Here is the lambda code:

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;
        };

I think its only a small bug in the Lambda Function. Thank you!

1 Answer 1

1

Excellent start! It looks like there are a few param keys that are incorrect. The error message clearly states 4...

  1. Missing required key 'TableName' in params. Tablename should be renamed to TableName.
  2. Unexpected key 'ExpressionAttributenames' found in params. ExpressionAttributenames should be renamed to ExpressionAttributeNames.
  3. Unexpected key 'ExpressionAttributValues' found in params. ExpressionAttributValues should be renamed to ExpressionAttributeValues.
  4. Unexpected key 'Tablename' found in params. This should go away once you fix number 1.

As an example, I believe the param object should look something like this...

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"
};
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.