从浏览器(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-sdk
和 dynamodb
。
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"
};
我是 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-sdk
和 dynamodb
。
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"
};