如何在 lambda 中运行同步 dynamodb 请求?

Vik*_*ash 5 lambda synchronous amazon-web-services

const params = {
  TableName: 'item-table',   
  FilterExpression : "#tagname = :itemId",
  ExpressionAttributeNames: {"#tagname": "itemId"},
  ExpressionAttributeValues: {":itemId": "000001"}    
    };
var item ="";
dynamo.scan(params, function(err, data)
{
 if (err) {
    console.error("Unable to query. Error:", JSON.stringify(err, null, 2));
    item = err;
    } else {
        console.log("Query succeeded.");
        data.Items.forEach(function(item) {
          item += item.itemName;
      });
      }
      return item;
});
Run Code Online (Sandbox Code Playgroud)

扫描不是等待返回输出而是进入下一步。我们如何运行从 lambda 到 dynamodb 的同步调用。

Fel*_*cob 6

如果您确实需要同步扫描,您可以使用以下方式之一:

1. 使用 JavaScript 的 Promise 资源:

const params = {
    TableName: 'item-table',   
    FilterExpression : "#tagname = :itemId",
    ExpressionAttributeNames: {"#tagname": "itemId"},
    ExpressionAttributeValues: {":itemId": "000001"} };

function scan(params) {
  return new Promise((resolve, reject) => {
    dynamo.scan(params, (err, data) => {
      if (err)
        reject(err);
      else
        resolve(data);
    };
  };
}

async function syncScan() {
  var data;
  try {
    data = await scan(params);
    console.log("Query succeeded.");
  }
  catch (err) {
  console.error("Unable to query. Error:", JSON.stringify(err, null, 2));
  }
        
  return data;
}

syncScan();
Run Code Online (Sandbox Code Playgroud)

2. 使用 aws-sdk 返回对象:

const AWS = require('aws-sdk');
AWS.config.update({ region: 'sa-east-1' });
const docClient = new AWS.DynamoDB.DocumentClient();

async function syncScan() {

  const params = {
    TableName: 'item-table',   
    FilterExpression : "#tagname = :itemId",
    ExpressionAttributeNames: {"#tagname": "itemId"},
    ExpressionAttributeValues: {":itemId": "000001"} 
  };

  const awsRequest = await docClient.scan(params);
  const result = await awsRequest.promise();
  console.log(result.Items); // <<--- Your results are here
}

syncScan();
Run Code Online (Sandbox Code Playgroud)


Vij*_*han -5

您不需要同步运行,这不是一个好主意。从扫描中执行回调,并在接收回调的地方执行所有其他逻辑,

const params = {
  TableName: 'item-table',   
  FilterExpression : "#tagname = :itemId",
  ExpressionAttributeNames: {"#tagname": "itemId"},
  ExpressionAttributeValues: {":itemId": "000001"}    
    };
var item ="";
dynamo.scan(params, function(err, data)
{
    callback(err,data);
});
Run Code Online (Sandbox Code Playgroud)

例如,您可以重构如下代码,

 scanDynamoDB(function(err,data){
    if (err) {
        console.error("Unable to query. Error:", JSON.stringify(err, null, 2));
        item = err;
        } else {
            console.log("Query succeeded.");
            data.Items.forEach(function(item) {
              item += item.itemName;
          });
        }
 })



function scanDynamoDB(callback)
{
    const params = {
        TableName: 'item-table',   
        FilterExpression : "#tagname = :itemId",
        ExpressionAttributeNames: {"#tagname": "itemId"},
        ExpressionAttributeValues: {":itemId": "000001"}    
          };
      var item ="";
      dynamo.scan(params, function(err, data)
      {
          callback(err,data);
      });
}
Run Code Online (Sandbox Code Playgroud)