Lambda函数

时间:2018-04-10 22:33:01

标签: amazon-web-services aws-lambda amazon-dynamodb serverless

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

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
})

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

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方法中对表名进行硬编码,而是像getItem方法一样动态分配它?

1 个答案:

答案 0 :(得分:4)

您可以使用环境变量中的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
})