0

设置:我正在尝试设置一个 Lambda 函数,该函数由来自 API 网关的 Web 套接字以及它订阅的 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 Gateway 调用的方法是:

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。

我对这一切都是新手,所以任何可以为我指明正确方向的帮助都会很棒。

先感谢您!

4

1 回答 1

0

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

这里有点“万岁玛丽”,但是您是否尝试过将回调版本切换为documentClient.putasync/await 版本?

它看起来像这样:


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

于 2020-09-22T16:54:18.923 回答