AWS Lambda函数全局变量



我正在用JavaScript(Node.js(编写一个AWS Lambda函数,该函数通过AWS SDK与CodeCommit交互。

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

我尝试了两种方法:

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

输出:
最后写入的"console.log";是第一个在执行结果中打印的,但显示为空白。然后打印另外两个console.log(在函数中(,它们显示数据。

2.功能

代码:

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

输出:

{
"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)"
]
}

结论
这些方法都不起作用。数据在函数内总是可见的,但在函数外永远不会可见。我怀疑函数外的代码在函数本身之前执行,我想知道我是否可以让代码等待函数执行后再执行console.log(以及之后的其他操作(。或者我在另一个层面上错了?

您使用的是回调模型,在这种情况下,第一个示例中的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块。如果您希望函数失败,请确保在这种情况下throw是一个新错误。

最新更新