从浏览器(CodePen)向 DynamoDB 添加数据失败

Adding data to DynamoDB from the browser (CodePen) fails

我是 AWS 的新手,当我尝试将数据输入到 dynamodb 并调用 'API gateway' 和 'DynamoDB' 之间的 lambda 函数时出现以下错误。

错误:

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

错误截图:

代码:
我在浏览器 (CodePen) 中尝试过(我从 API 网关使用了正确的 Invoke URL):

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

当运行上述代码来自CodePen时调用以下lambda函数:
我在那里正确导入了 aws-sdkdynamodb

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

在上面的 lambda 函数中,您可以观察到我已将输入格式化为数字,但在 API 网关中,在 POST 集成请求中,我已将输入转换为字符串。所以通过 lambda 函数传递的数据已经是一个字符串。无需再次通过 Lambda 函数格式化。

'POST Integration-Request' 中的人体映射器:

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

我需要知道上述错误的原因,很乐意提供所需的任何其他信息。

提前谢谢你。

更改参数以指示年龄字段的值为“字符串”而不是“数字”:

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