Home > Enterprise >  Adding data to DynamoDB from the browser (CodePen) fails
Adding data to DynamoDB from the browser (CodePen) fails

Time:01-20

I am new to AWS and got the following error when I tried to input data to the dynamodb invoking the lambda function between the 'API gateway' and the 'DynamoDB'.

Error:

Expected params.Item['Age'].S to be a string........

Screenshot of the Error:

enter image description here

Code:
I tried in the browser (CodePen) (I used the correct Invoke URL from the API gateway):

var xhr = new XMLHttpRequest();
xhr.open('POST', 'The API Invoke URL');
xhr.onreadystatechange = function(event){
  console.log(event.target.response);
}
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send(JSON.stringify({age: 26, height: 71, income: 2400}));

The following lambda function is invoked when running the above code from CodePen:
There I have imported the aws-sdk and dynamodb correctly.

exports.fn = (event, context, callback) => {
    const params = {
        Item: {
            "UserId": {
                S: "user_"   Math.random()
            },
            "Age": {
                N: event.age
            },
            "Height": {
                N: event.height
            },
            "Income": {
                N: event.income
            }
        },
        TableName: "compare-yourself"
    };
    dynamodb.putItem(params, function(err, data) {
        if (err) {
            console.log(err);
            callback(err);
        } else {
            console.log(data);
            callback(null, data);
        }
    });
};

In the above lambda function you can observe that I have formatted the inputs as numbers but in the API gateway, in the POST integration request I have converted the inputs to strings. so the data that is passed via the lambda function is already a string. No need to format by the Lambda function, again.

Body mapper in 'POST Integration-Request':

#set($inputRoot = $input.path('$'))
{
  "age" : "$inputRoot.age",
  "height": "$inputRoot.height",
  "income": "$inputRoot.income"
}

I need to know the reason for the above error and am happy to provide any additional information required.

Thank you in advance.

CodePudding user response:

Change the params to indicate that the value of the age field is "String" and not "Numeric":

const params = {
        Item: {
            "UserId": {
                S: "user_"   Math.random()
            },
            "Age": {
                "S": event.age # This was previously set to "N" which causes the issue
            },
            "Height": {
                N: event.height
            },
            "Income": {
                N: event.income
            }
        },
        TableName: "compare-yourself"
    };
  •  Tags:  
  • Related