0

我正在尝试从另一个 lambda 函数调用一个字符串。该字符串应写入一个数组,然后将该数组连同日期等信息一起上传到 DynamoDB 表中。

然而,当我尝试在应该上传到 DynamoDB 的脚本下部获取名为“key”的变量时,它是未定义的并且未写入表中。

我尝试使用window.variable命令,但不知何故 AWS lambda 无法识别它。总而言之,对于如何在 JavaScript 中的不同函数之间传递变量,我还是很陌生并且有点困惑。

也许有人可以帮助我。谢谢!

var key;    //define key as gloabal variable
var AWS = require('aws-sdk');   //load aws-sdk
AWS.config.region = 'eu-central-1'; //Set server region
var lambda = new AWS.Lambda();      
var db = new AWS.DynamoDB.DocumentClient({region: 'eu-central-1'});   //region of dynamo server



exports.handler = function(event, context) {
  var params = {
    FunctionName: 'string_Generator', // called Function
    InvocationType: 'RequestResponse',
  };
  
  lambda.invoke(params, function(err, data) {
    if (err) {
      context.fail(err);
    } else {
      context.succeed(data.Payload);
      
    }
    
    key = data.Payload;   //set the payload/string as "key" variable
   
  });
}


exports.handler = async (event) => {
    var params = {
        Item: {
            date: Date.now(),
            Key: key
        },
        TableName: 'Productkeys'
    };
    params.Item.partitionkey = "3";         //putting in the partition key of the DynamoServer
    return await db.put(params).promise();
    

}

4

2 回答 2

0

好的,我整晚都经历了它,但我能够通过@ffritz 的建议来修复它。

我尝试了一些不同的组合,并试图更好地理解语法,直到最终成功。它可能不是最漂亮的代码,但它可以工作

谢谢你们的帮助。

编辑:我又发现了一个问题。代码不会立即执行。生成的密钥只保留在函数中,并在下一次调用时部署。因此,当我通过 API Gateway 调用该函数时,我不会部署新生成的字符串,而是部署旧字符串。我仍然需要为此找到解决方法。

编辑2:现在可以了。我更新了下面的脚本。

var AWS = require('aws-sdk');         //load aws sdk
AWS.config.region = 'eu-central-1';   //Server of Lambda 
var lambda = new AWS.Lambda();  
var db = new AWS.DynamoDB.DocumentClient({region: 'eu-central-1'});   //region of DB Server


exports.handler = function(event, context, callback) {
    
    var params = {                                                  //set parameters for the call 
        FunctionName: 'String_Generator',                           // called Function
        InvocationType: 'RequestResponse',
    };
   
    lambda.invoke(params, function(err, data) {                     //Invoke other function
        if (err) {
            context.fail(err);
        } else {                                                    //if invoke gets string
                                    
                var params2 = {                                     //set parameters for DB put
                    Item: {
                        date: Date.now(),
                        Key: data.Payload                           //set the string as "Key" variable
                        },
                    TableName: 'Productkeys'         
                };
            params2.Item.partitionkey = data.Payload;               //add the partition key
            db.put(params2);                                        //put the params2 into the DB
            callback(null, data.Payload);
        }
    });
};

于 2020-07-01T05:32:58.587 回答
0

一个问题是您正在覆盖您的handler函数,因为您有 2 个同名的函数。另一件事是看起来这在一个函数中可能会更好,因为一个函数取决于另一个函数,我不知道您如何调用它们或从哪里调用它们。

尝试这个:

exports.handler = async () => {
    var params = {
        FunctionName: 'string_Generator', // called Function
        InvocationType: 'RequestResponse',
    };
    
    lambda.invoke(params, function(err, data) {
        if (err) {
            context.fail(err);
        } else {
            context.succeed(data.Payload);  
        }

        var params2 = {
            Item: {
                date: Date.now(),
                Key: data.Payload
            },
            TableName: 'Productkeys'
        };
        params2.Item.partitionkey = "3";
        return await db.put(params2).promise();
    });
};
于 2020-06-30T15:41:17.870 回答