从 Lambda 函数写入 DynamoDB
Writing to DynamoDB from Lambda Function
设置:我正在尝试设置一个由来自 API 网关的 Web 套接字触发的 Lambda 函数以及它订阅的 SNS 主题。根据传入的事件,我确定哪个服务发起了调用并相应地处理事情。
问题:我在理解如何使用 DynamoDB 时遇到了一个真正的问题。建立 Web 套接字连接后,我将该连接 ID 插入 Dynamo,以便在收到来自 SNS 的消息时对其进行响应。无论出于何种原因,我对 Dynamo 的所有调用都不会调用它们各自的回调。我假设他们失败了,但看起来没有抛出任何错误。我在这里调用“put”命令的方式有问题吗?
我 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 db 的完全访问权限,所以我认为我的访问键值不是必需的但我把它们放在那里只是因为此时我正在尝试一切)但是在我的 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)
}
设置:我正在尝试设置一个由来自 API 网关的 Web 套接字触发的 Lambda 函数以及它订阅的 SNS 主题。根据传入的事件,我确定哪个服务发起了调用并相应地处理事情。
问题:我在理解如何使用 DynamoDB 时遇到了一个真正的问题。建立 Web 套接字连接后,我将该连接 ID 插入 Dynamo,以便在收到来自 SNS 的消息时对其进行响应。无论出于何种原因,我对 Dynamo 的所有调用都不会调用它们各自的回调。我假设他们失败了,但看起来没有抛出任何错误。我在这里调用“put”命令的方式有问题吗?
我 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 db 的完全访问权限,所以我认为我的访问键值不是必需的但我把它们放在那里只是因为此时我正在尝试一切)但是在我的 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)
}