我正在尝试将一个硬编码数据项放到DynamoDB上。我正在使用AWS SDK对象来执行此更新。所有的调试" Console.log"在下面的代码中打印,但最终打印任务在3.00秒后超时
没有更新DynamoDB
function updatedb(intent, session, callback) {
let country;
const repromptText = null;
const sessionAttributes = {};
let shouldEndSession = false;
console.log("In the function");
const AWS = require("aws-sdk");
const docClient = new AWS.DynamoDB.DocumentClient({ region: 'eu-west-1' });
var params = {
TableName: "Location",
Item: {
"LocationID": { "S": "11" },
"Country": { "S": "10" },
"Description": { "S": "10" },
"Name": { "S": "10" }
}
};
console.log("Param loaded & executing the DocClient Put");
docClient.put(params, function (err, data) {
if (err) {
speechOutput = 'Update failed';
console.error("Unable to create table. Error JSON:", JSON.stringify(err, null, 2));
callback(sessionAttributes,
buildSpeechletResponse(intent.name, speechOutput, repromptText, shouldEndSession));
} else {
console.log("Created table. Table description JSON:", JSON.stringify(data, null, 2));
speechOutput = 'Update successful';
callback(sessionAttributes,
buildSpeechletResponse(intent.name, speechOutput, repromptText, shouldEndSession));
}
});
}
已检查以下项目
1)有一个名为"位置"在DynamoDB中 2)DynamoDB和这个lambda函数都在ue-west-1(爱尔兰) 3)为此Lambda函数分配的角色可以对此表执行所有操作。请参阅下面的政策详情
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1510603004000",
"Effect": "Allow",
"Action": [
"dynamodb:*"
],
"Resource": [
"arn:aws:dynamodb:eu-west-1:752546663632:table/Location"
]
}
]
}
我的Lambda函数如何定位表" location"只是与该地区? - 代码似乎没有终点等? - 刚刚根据教程开发。
这就是我所缺少的吗?
请帮忙吗?
答案 0 :(得分:0)
我相信AWS会根据您的身份以及区域和表名来定位表。
我能够使用以下代码成功发布到表格中:
const AWS = require('aws-sdk');
const dynamoDB = new AWS.DynamoDB({region: 'us-west-2'});
var params = {
TableName: "my-table",
Item: {
"LocationID": { S: "11" },
"Country": { S: "10" },
"Description": { S: "10" },
"Name": { S: "10" }
}
};
dynamoDB.putItem(params, (err, data) => {
if (err){
console.error(err.stack);
} else {
console.log(data);
}
});
如果您实际上可以从CLI发布到表中,那么仍然至少存在一个问题:您似乎错误地使用了DocumentClient
类。您似乎将DynamoDB.putItem
的语法与DynamoDB.DocumentClient.put
的语法混合在一起。
如果您注意到,我的代码会直接使用DynamoDB
类 - 根据您正在做的事情,我认为您没有理由不这样做。否则,您应该更改Item
对象:
var params = {
TableName: "my-table",
Item: {
"LocationID": "11",
"Country": "10",
"Description": "10",
"Name": "10"
}
};
我的猜测是您的代码当前错误,因为您尝试在要插入字符串的位置插入地图。如果您配置了Cloudwatch,则可以查看日志。
最后,我没有看到您在代码中使用callback
。如果你打算回应一个叫lambda的客户,你应该这样做。根据您的NodeJS版本,lambda可以简单地超时而不返回有用的响应。
答案 1 :(得分:0)
我有一个类似的问题,尝试在函数的开头放置require语句。
const AWS = require("aws-sdk");
const docClient = new AWS.DynamoDB.DocumentClient({ region: 'eu-west-1' });