AWS Lambda Promise.all is never Return或Wait不适用于它
所以我有下面的代码。当我在本地运行它时,它会按预期工作。当我将其发布到lambda时,它无法获取我的S3项目。我看到为我的请求创建了承诺,但是return Promise.allps永远不会返回预期值。我试着用几种不同的方式来改变它,但总是一无所获。我将我的本地环境更新为与lambda node 8.10和aws sdk 2.290.0相同,它仍然在本地工作,但在托管时不能工作 cloudwatch日志显示它已结束,不包含错误,并在约100ms内结束 我要求从s3中获取20个对象,每个8k大小;我添加了一个中断,只检索了1条记录,同样的情况也发生了。。。没什么AWS Lambda Promise.all is never Return或Wait不适用于它,lambda,promise,async-await,aws-sdk-js,Lambda,Promise,Async Await,Aws Sdk Js,所以我有下面的代码。当我在本地运行它时,它会按预期工作。当我将其发布到lambda时,它无法获取我的S3项目。我看到为我的请求创建了承诺,但是return Promise.allps永远不会返回预期值。我试着用几种不同的方式来改变它,但总是一无所获。我将我的本地环境更新为与lambda node 8.10和aws sdk 2.290.0相同,它仍然在本地工作,但在托管时不能工作 cloudwatch日志显示它已结束,不包含错误,并在约100ms内结束 我要求从s3中获取20个对象,每个8k大小;
module.exports = async(messages) => {
try {
for (var rec of messages) {
debug('rec',rec);
let samples = await getRecordingPageSamples(rec.serialNumber,rec.recordingSet,rec.recording,rec.pages);
//NEVER GETS HERE IN LAMBDA
...
}
//NEVER GETS HERE IN LAMBDA
console.log('we are done here.');
} catch (e) {
console.log('unhandled',e);
}
};
function getRecordingPageSamples(serialNumber,recordingSet,recording,pages){
let ps = getObjectGenerator(pages.map(x=>[process.env.s3EeegPageBucket,genRecordingSamplePath(serialNumber,recordingSet,recording,x)]));
ps = ps.map( p=> p.then(obj=>{
console.log('done',obj[1]);
return obj.slice(0,2).concat([obj[1].split(s.FILE_NAME_SEP)[2],obj[2].Body.toString()]);
}));
// here ps is an array of promises ps [ Promise { <pending> } ]
return Promise.all(ps);
}
function getObjectGenerator(list){
let ps = [];
for (let x of list){
//DOES GET HERE IN LAMBDA
console.log('requesting obj',x);
ps.push( getObject(x[0],x[1]));
}
return ps;
}
const getObject = (bucket,key) => {
return s3.getObject({
Bucket: bucket, // Assuming this is an environment variable...
Key: key
})
.promise()
.then(data=>{
//NEVER GETS HERE IN LAMBDA
console.log('got it',key);
return [bucket,key,data];
});
问题解决了。这个模块上面还有一个包装器函数,它是一个异步函数,但没有使用wait关键字。新手失误 问题解决了。这个模块上面还有一个包装器函数,它是一个异步函数,但没有使用wait关键字。新手失误!谢谢@Evert您是否正确地等待lambda处理函数的顶级函数?@Evert您是我的GD英雄。。。我尝试重用代码,但在包含异步函数时,我错过了等待。干杯很高兴我能帮忙!我自己也遇到了一些事情=有一个好方法在本地盒子上运行它可能会有所帮助。更明显地看到处理程序函数何时结束。我在本地运行它,但它似乎运行到完成。我开始跟踪它,因为我添加了更多的日志记录,显示最终在承诺完成之前运行。我想以类似的方式在本地实现这一点的唯一方法是创建另一个包装器,在处理程序返回后终止节点进程。有没有想过如何做到这一点?我知道有一些工具可以为您完成所有这些,但我这样做的方式是,在处理程序返回后,只需要输出一点点。process.exit更具攻击性,但也可能有效。