能否在AWS Lambda函数中将DynamoDB的Scan查询结果存储到变量中
需求可行性说明
该需求完全可以实现,你当前写法无法直接拿到字段值是因为AWS SDK的操作默认是异步回调模式,直接赋值拿到的是SDK返回的请求实例,不是真实查询结果。
现有代码存在的问题
- 重复初始化了两次
DynamoDB.DocumentClient,ddb和docClient两个实例功能完全一致,属于冗余代码可以删除其中一个 - 回调模式下查询结果只能在回调函数内部访问,无法直接赋值给外部变量后在外部访问
推荐解决方案:使用async/await语法
Node.js版本的AWS Lambda原生支持async/await语法,将异步操作转为同步写法,就能直接把查询结果赋值给变量后访问字段:
'use strict'; const aws = require('aws-sdk'); // 仅初始化一次DocumentClient即可 const ddb = new aws.DynamoDB.DocumentClient({region: 'us-east-2'}); // 将handler声明为async函数 exports.handler = async (event, context) => { const params = { TableName: 'parking_lots', Limit: 10 } try { // 用await等待查询完成,直接获取返回结果 const scanRes = await ddb.scan(params).promise(); // scan返回的Items是符合条件的记录数组,需要指定下标访问对应记录 // 访问第一条记录的lot_number字段写法如下: const targetLotNum = scanRes.Items[0]?.lot_number; console.log('获取到的停车场编号:', targetLotNum); // 后续执行写入/更新操作时,直接调用上面定义的变量即可 // 示例:更新对应停车场的状态 /* const updateParams = { TableName: 'parking_lots', Key: { lot_number: targetLotNum }, UpdateExpression: 'set #status = :newStatus', ExpressionAttributeNames: { '#status': 'status' }, ExpressionAttributeValues: { ':newStatus': '已占用' } } await ddb.update(updateParams).promise(); */ return { statusCode: 200, data: scanRes.Items } } catch (err) { console.error('操作出错:', err); return { statusCode: 500, errorMsg: err.message } } };
其他说明
- 如果你使用的是按主键查询的
get方法,返回结果的Item是单个对象,不需要指定下标,可以直接用getRes.Item.lot_number访问字段 - 如果坚持使用回调写法,所有需要用到查询结果的逻辑都必须写在回调函数内部,不能在回调外访问结果:
ddb.scan(params, function(err, data){ if(err){ console.log(err); return; } // 所有用到查询结果的逻辑都放在这里执行 const lotNum = data.Items[0].lot_number; console.log(lotNum); // 后续写入、更新操作都在这里调用 });
内容的提问来源于stack exchange,提问作者Aldiyar
相关产品推荐
相关产品推荐

