从Lambda函数写入DynamoDB



设置:我正在尝试设置一个Lambda函数,该函数由来自API网关的Web套接字触发,还有一个它订阅的SNS主题。根据传入的事件,我确定是哪个服务发起了调用,并相应地处理事情。

问题:我在理解如何使用DynamoDB方面遇到了一个真正的问题。当建立了网络套接字连接时,我会将该连接id插入Dynamo,以便在收到来自SNS的消息时对其进行响应。不管出于什么原因,我打给迪纳摩的所有电话都没有打各自的回拨。我假设他们失败了,但看起来并没有出现任何错误。我称之为";放入";命令在这里?

我的index.js顶部的代码是:

const aws = require("aws-sdk");
const tableName = process.env.TABLENAME;
var accessKeyId = process.env.DYNAMODB_ACCESS_KEY_ID;
var secretAccessKey = process.env.DYNAMODB_SECRET_ACCESS_KEY;
var documentClient = new aws.DynamoDB.DocumentClient({
region: 'us-east-1',
accessKeyId: accessKeyId,
secretAccessKey: secretAccessKey
});

我处理API网关调用的方法是:

const {
requestContext: {connectionId, routeKey}
} = event;
if (routeKey === "$connect") {
// handle new connection
console.log("Adding Connection",  event);

const putParams = {
Item: {
'ConnectionId': connectionId
},
TableName: tableName,
};
console.log("put params", putParams);

documentClient.put(putParams, function(err, data) {
if (err) {
console.log(err, err.stack);
return {
response: 400,
body: "Error " + JSON.stringify(err)
};
}
else {
console.log("Response Received: ", data);
return {
response: 200,
body: "Connected - " + connectionId
};
}
});
}
else  if (routeKey === "$disconnect") {
// handle disconnection
console.log("Disconnected");
}
else { 
// $default handler
console.log("Default");
return {
response: 200,
body: "default"
};
}

当我运行一个测试请求时,控制台日志显示了我所有环境变量的正确值(我授予Lambda函数对dynamo数据库的完全访问权限,所以我认为我的访问键值没有必要,但我把它们放在那里只是因为我现在正在尝试所有东西(,但在我的documentClient.put调用之后,对put命令的回调永远不会被调用。

我的DynamoDB有一个分区键:ConnectionId(这是我在其中唯一的值(,没有SortKey。

我对这一切都是新手,所以任何能为我指明正确方向的帮助都将是非常棒的。

提前谢谢!

您的问题听起来类似于由于put操作的异步性质而出现的问题。

一位";"玛丽万岁";在这里,但您是否尝试过将documentClient.put的回调版本切换为async/await版本?

它看起来像这样:


try{
await documentClient.put(putParams).promise()
console.log("All done!")
}catch(error){
console.log(error)
}

最新更新