繁体   English   中英

AWS Lambda function 全局变量

[英]AWS Lambda function global variables

我正在 JavaScript (Node.js) 中编写一个 AWS Lambda function (Node.js),它通过 AWS ZF26F37ABD6E54C3F8 与 CodeCommit 交互。

服务之间的通信按预期工作,我在 CodeCommit function 中获取数据,但是当我想在 function 之外使用这些数据时,就会出现我面临的问题。

我尝试了两种方法:

1. 全局变量

代码:

var aws = require('aws-sdk');
var codecommit = new aws.CodeCommit({ apiVersion: '2015-04-13' });
var repoName = ''; // Declared my global variable here

exports.handler = function(event, context) {
    
    var commitId = "69a5f8eeba340d71ba41b8f20d77cc20b301ff52"
    var repository = "my-repository"
    
    var params = {
        repositoryName: repository
    };
    codecommit.getRepository(params, function(err, data) {
        if (err) {
            console.log(err);
            var message = "Error getting repository metadata for repository " + repository;
            console.log(message);
            context.fail(message);
        } else {
            console.log('Repository Name:', data.repositoryMetadata.repositoryName); // Shown with data
            repoName = data.repositoryMetadata.repositoryName; // Setting the variable
            console.log('Account Id:', data.repositoryMetadata.accountId); // Shown with data
        }
    });
    
    console.log(repoName); // Shown as blank in the output
};

Output:
最后写入的“console.log”在执行结果中最先打印,但显示为空白。 然后打印另外两个console.log(在函数内),并显示数据。

2. Function

代码:

var aws = require('aws-sdk');
var codecommit = new aws.CodeCommit({ apiVersion: '2015-04-13' });

exports.handler = function(event, context) {
    
    var commitId = "69a5f8eeba340d71ba41b8f20d77cc20b301ff52"
    var repository = "my-repository"
    
    var repoData = getRepository(repository)
    
    console.log('Repository Name:', repoData.repositoryName);
    console.log('Account Id:', repoData.accountId);
};

function getRepository(repository) {
    var params = {
        repositoryName: repository
    };
    codecommit.getRepository(params, function(err, data) {
        if (err) {
            console.log(err);
            var message = "Error getting repository metadata for repository " + repository;
            console.log(message);
            context.fail(message);
        } else {
            var repoData = {};
            repoData.repositoryName = data.repositoryMetadata.repositoryName;
            repoData.accountId = data.repositoryMetadata.accountId;
            console.log(repoData); // Shows output in execution results when lines 11 & 12 are commented
            return repoData;
        }
    });
}

Output:

{
  "errorType": "TypeError",
  "errorMessage": "Cannot read property 'repositoryName' of undefined",
  "trace": [
    "TypeError: Cannot read property 'repositoryName' of undefined",
    "    at Runtime.exports.handler (/var/task/index.js:57:46)",
    "    at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)"
  ]
}

结论
这些方法都不起作用。 数据在 function 中始终可见,但在其外部始终可见。 我怀疑 function 之外的代码在 function 本身之前执行,我想知道我是否可以让代码等待 ZC1C425268E68385D1AB5074C17A94F14 操作之后执行)。 或者也许我在另一个层面上错了?

您正在使用回调 model,在这种情况下,第一个示例中的console.log在回调中的代码之前被命中。 更好的选择是使用async/await

var aws = require('aws-sdk');
var codecommit = new aws.CodeCommit({ apiVersion: '2015-04-13' });
var repoName = ''; // Declared my global variable here

exports.handler = async function(event, context) {
    
    var commitId = "69a5f8eeba340d71ba41b8f20d77cc20b301ff52"
    var repository = "my-repository"
    
    var params = {
        repositoryName: repository
    };
    var data = await codecommit.getRepository(params).promise();

    console.log('Repository Name:', data.repositoryMetadata.repositoryName); // Shown with data
    repoName = data.repositoryMetadata.repositoryName; // Setting the variable
    console.log('Account Id:', data.repositoryMetadata.accountId); // Shown with data
    
    console.log(repoName);
};

请注意,我在这里没有发现错误,但如果您愿意,可以使用try/catch块。 如果您希望 function 失败,请确保在这种情况下throw一个新错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM