Lambda 函数中的 DynamoDB BatchGetItem 动态 TableName

DynamoDB BatchGetItem dynamic TableName in Lambda function

我正在使用 dynamoDb 作为我的数据库为我当前的应用程序构建一个无服务器后端。我使用 aws sam 将我的 lambda 函数上传到 aws。此外,我将所有 table 名称作为全局变量传递给 lambda (nodejs8.10 运行time),以便在我的 lambda 函数中的 process.env 对象上访问它们。我面临的问题如下:每当我 运行 dynamoDB 上的 batchGetItem 方法时,我必须传递一个字符串作为我的 table 名称,我无法动态更改 table 名称取决于全局变量:

const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB({region: 'ap-south-1'}, {apiVersion:'2012-08-10'});

const params = {
    RequestItems: {
        //needs to be a string, cannot be a variable containing a string
        'tableName': {
            Keys: [] //array of keys
         }
    }
}
dynamodb.batchGetItem(params, (err, result) => {
// some logic
})

我需要将 table 名称作为字符串传递,实质上是将 table 名称硬编码到我的函数中。其他 DynamoDB 操作,例如 getItem 方法,接受参数对象中 table 名称的键值对:

const tableName = process.env.TableName;
const getItemParams = {
   Key: {
        "Key": {
             S: 'some key'
         }
   },
   // table name can be changed according to the value past to lambda's environment variable
   TableName: tableName
}
dynamodb.getItem(getItemParams, (err, result) => {
// some logic
}

因此我的问题是,有什么方法可以避免在 batchGetItem 方法中对 table 名称进行硬编码,而是像在 getItem 方法中那样动态分配它?

您可以使用环境变量中的 tableName。分两步构建您的参数:

const { tableName } = process.env;

const params = {
  RequestItems: {},
};

// `tableName` is your environment variable, it may have any value
params.RequestItems[tableName] = {
  Keys: [], //array of keys
};

dynamodb.batchGetItem(params, (err, result) => {
  // some logic
})