如何在CLI中返回DynamoDB里连接WebSocket API的用户列表?
如何将DynamoDB扫描结果返回至WebSocket CLI客户端
我来帮你搞定这个问题!你现在的Lambda代码已经能成功扫描DynamoDB获取用户名,但因为WebSocket API的响应机制和普通HTTP不同,你需要通过API Gateway的管理API主动把结果推送给你的CLI客户端(也就是当前的WebSocket连接)。下面是具体的修改步骤和完整代码:
关键修改点说明
- 获取当前连接ID:WebSocket连接的唯一标识
connectionId存在event.requestContext.connectionId里,我们需要用它来定向发送消息。 - 调用API Gateway管理API:使用AWS SDK的
ApiGatewayManagementApi类,调用postToConnection方法把扫描结果发送给客户端。 - 格式化返回数据:把DynamoDB扫描的原始结果转换成CLI易读的格式(比如提取所有用户名组成数组)。
- 权限配置:确保你的Lambda执行角色有
execute-api:ManageConnections权限,允许它调用API Gateway的管理API。
完整修改后的Lambda代码
const AWS = require('aws-sdk'); // 初始化API Gateway管理客户端,替换成你的API Gateway实际端点 const apigwManagementApi = new AWS.ApiGatewayManagementApi({ endpoint: 'https://<你的API Gateway ID>.execute-api.<区域>.amazonaws.com/<阶段名>' }); const ddb = new AWS.DynamoDB.DocumentClient(); exports.handler = async function(event, context) { try { // 获取当前WebSocket连接的唯一ID const connectionId = event.requestContext.connectionId; // 扫描DynamoDB获取所有用户名 const scannedItems = await displayUsers(); // 提取用户名并格式化为易读的列表 const userList = scannedItems.Items.map(item => item.username); const responseContent = `当前已连接的用户:${JSON.stringify(userList)}`; // 主动推送消息到当前CLI客户端的WebSocket连接 await apigwManagementApi.postToConnection({ ConnectionId: connectionId, Data: JSON.stringify(responseContent) }).promise(); return { statusCode: 200 }; } catch (error) { console.error('处理请求出错:', error); // 发送失败时返回错误状态码 return { statusCode: 500, body: JSON.stringify({ error: error.message }) }; } }; async function displayUsers() { return ddb.scan({ TableName: 'Chat', ProjectionExpression: "username" }).promise(); }
注意事项
- 替换API Gateway端点:把代码里的
endpoint替换成你自己的WebSocket API端点,格式为https://<api-id>.execute-api.<region>.amazonaws.com/<stage>,你可以在API Gateway控制台的WebSocket API详情页找到这个地址。 - 配置Lambda权限:给Lambda的执行角色添加IAM策略,允许它调用
execute-api:PostToConnection动作,目标资源为你的API Gateway管理API ARN(示例:arn:aws:execute-api:<region>:<account-id>:<api-id>/<stage>/POST/@connections/*)。 - 测试验证:修改完成后重新部署Lambda和API Gateway,再用
wscat -c [wssURL]?username=Zeus连接,触发对应路由(比如发送一条消息触发该Lambda执行),就能在CLI中看到返回的用户列表了。
内容的提问来源于stack exchange,提问作者RookieDev
相关产品推荐
相关产品推荐

