在 node.js Lambda for AWS 中处理连续的 DynamoDB 调用

Handling consecutive DynamoDB calls in a node.js Lambda for AWS

我的例子很简单。我在代理模式下使用 AWS Lambda,其中 index.js 看起来像这样。

const awsServerlessExpress = require('aws-serverless-express');
const app = require('./app');

const server = awsServerlessExpress.createServer(app);

exports.handler = (event, context) => {
  console.log(`EVENT: ${JSON.stringify(event)}`);
  return awsServerlessExpress.proxy(server, event, context, 'PROMISE').promise;
};

我有一个单独的 app.js 文件,其中有一个 POST 端点。在这个端点内,我需要在 DynamoDB table.

上进行两个查询

我需要先查询 table 以确定是否存在某些内容。 我的代码看起来像这样。

// DynamoDB Document Client
const docClient = new AWS.DynamoDB.DocumentClient();
app.post('/profile/:userSub', (req, res) => {
  const userSub = req.params.userSub;
  const accountName = req.body.accountName; 

  // First query
  const params = {
    TableName: profileTableName,
    IndexName: profileIndexAccountName,
    KeyConditionExpression: 'accountName = :accountName',
    ExpressionAttributeValues: {
      ':accountName' : accountName
    }
  };

  docClient.query(params, (err, data) => {
    // Process the results
     
  });
}

问题是我想根据第一个查询的结果进行后续查询docClient.put

我不明白如何将查询链接在一起,以便第一个查询在第二个查询执行之前完成。

有人可以给我举个例子吗?或者,如果使用 async/await 有更好的方法,那么我很乐意遵循它。

TL;DR 更喜欢 SDK 的 async-await 模式。

这里是一个连续的例子async-await calls using the AWS SDK for JavaScript v3.*. Note the async keyword in the function signature and the await keyword before the promise-returning method calls. The docs have the complete client initialization code

// myLambda.js
import { DynamoDBDocument } from '@aws-sdk/lib-dynamodb';

// ... configure client

const ddbDocClient = DynamoDBDocument.from(client);

export async function handler(event) {
  // ... other stuff

  const getResult = await ddbDocClient.get({ TableName, Key });

  const putResult = await ddbDocClient.put({
    TableName,
    Item: { id: '2', content: getResult.Item.Name },
  });
}

* @aws-sdk/lib-dynamodb library's DynamoDBDocument 是代码中 v2 客户端的 v3 等价物。它公开了 .get.put 等便捷方法。它还有助于在原生 js 类型和 DynamoDB 属性值之间进行转换。