Javascript AWS Lambda函数全局变量

Javascript AWS Lambda函数全局变量,javascript,node.js,amazon-web-services,aws-lambda,serverless,Javascript,Node.js,Amazon Web Services,Aws Lambda,Serverless,我正在用JavaScript(Node.js)编写一个AWS Lambda函数,该函数通过AWS SDK与CodeCommit交互 服务之间的通信按预期工作,我在CodeCommit函数中获取数据,但是当我想在函数之外使用这些数据时,我面临的问题就出现了 我尝试了两种方法: 1。全局变量 代码: var aws=require('aws-sdk'); var codecommit=新的aws.codecommit({apiVersion:'2015-04-13'}); 变量repoName=“”

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

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

我尝试了两种方法:

1。全局变量

代码:

var aws=require('aws-sdk');
var codecommit=新的aws.codecommit({apiVersion:'2015-04-13'});
变量repoName=“”;//在这里声明了我的全局变量
exports.handler=函数(事件、上下文){
var commitId=“69a5f8eeba340d71ba41b8f20d77cc20b301ff52”
var repository=“我的存储库”
变量参数={
repositoryName:存储库
};
getRepository(参数、函数(错误、数据){
如果(错误){
控制台日志(err);
var message=“获取存储库元数据时出错”+存储库;
控制台日志(消息);
失败(消息);
}否则{
console.log('Repository Name:',data.repositoryMetadata.repositoryName);//与数据一起显示
repoName=data.repositoryMetadata.repositoryName;//设置变量
console.log('Account Id:',data.repositoryMetadata.accountId);//与数据一起显示
}
});
console.log(repoName);//在输出中显示为空
};
输出:
最后写入的“console.log”是第一个在执行结果中打印的,但显示为空白。然后打印另外两个console.log(在函数中),并显示数据

2。功能

代码:

var aws=require('aws-sdk');
var codecommit=新的aws.codecommit({apiVersion:'2015-04-13'});
exports.handler=函数(事件、上下文){
var commitId=“69a5f8eeba340d71ba41b8f20d77cc20b301ff52”
var repository=“我的存储库”
var repoData=getRepository(存储库)
log('repositoryName:',repoData.repositoryName);
console.log('Account Id:',repoData.accountId);
};
函数getRepository(存储库){
变量参数={
repositoryName:存储库
};
getRepository(参数、函数(错误、数据){
如果(错误){
控制台日志(err);
var message=“获取存储库元数据时出错”+存储库;
控制台日志(消息);
失败(消息);
}否则{
var repoData={};
repoData.repositoryName=data.repositoryMetadata.repositoryName;
repoData.accountId=data.repositoryMetadata.accountId;
console.log(repoData);//注释第11行和第12行时,在执行结果中显示输出
返回数据;
}
});
}
输出:

{
“errorType”:“TypeError”,
“errorMessage”:“无法读取未定义的属性'repositoryName'”,
“跟踪”:[
“TypeError:无法读取未定义的属性'repositoryName'”,
“at Runtime.exports.handler(/var/task/index.js:57:46)”,
“at Runtime.handleOnce(/var/Runtime/Runtime.js:66:25)”
]
}
结论

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

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

var aws=require('aws-sdk');
var codecommit=新的aws.codecommit({apiVersion:'2015-04-13'});
变量repoName=“”;//在这里声明了我的全局变量
exports.handler=异步函数(事件、上下文){
var commitId=“69a5f8eeba340d71ba41b8f20d77cc20b301ff52”
var repository=“我的存储库”
变量参数={
repositoryName:存储库
};
var data=await codecommit.getRepository(params.promise();
console.log('Repository Name:',data.repositoryMetadata.repositoryName);//与数据一起显示
repoName=data.repositoryMetadata.repositoryName;//设置变量
console.log('Account Id:',data.repositoryMetadata.accountId);//与数据一起显示
console.log(repoName);
};

请注意,我在这里没有捕获错误,但是如果您想捕获,可以使用
try/catch
块。如果希望函数失败,请确保在这种情况下抛出一个新错误。

重要的是,您尝试
返回repoData
实际上不会是
getRepository()
函数的返回值。相反,它是当
codecommit.getRepository(…)
完成并丢弃时内部回调函数的返回值。您的
getRepository()
函数没有显式返回任何内容(它没有返回语句),因此隐式返回undefined。这就是为什么会出现错误
“无法读取未定义的属性'repositoryName'”
。感谢您提供此解决方案。我已经在AWS Lambda进行了测试,但它不起作用。我得到的是“任务在30秒后超时”。如果你得到的是任务超时,则是另一个问题。你改变了什么吗?该功能现在是否在专有网络中运行?出现超时的主要原因是网络问题,函数无法到达CodeCommit端点。