Javascript AWS Lambda在不等待承诺的情况下返回
我有一个函数在节点环境中工作得非常好。该函数使用承诺、S3调用和then and catch调用回调,每个回调中包含相关的200/500状态码和消息体 现在我将其部署为一个lambda函数,其周围有一个包装器,如下所示:Javascript AWS Lambda在不等待承诺的情况下返回,javascript,amazon-web-services,aws-lambda,es6-promise,Javascript,Amazon Web Services,Aws Lambda,Es6 Promise,我有一个函数在节点环境中工作得非常好。该函数使用承诺、S3调用和then and catch调用回调,每个回调中包含相关的200/500状态码和消息体 现在我将其部署为一个lambda函数,其周围有一个包装器,如下所示: module.exports.getAvailableDates = (event, context, callback) => { const lambdaParams = retrieveParametersFromEvent(event); console.
module.exports.getAvailableDates = (event, context, callback) => {
const lambdaParams = retrieveParametersFromEvent(event);
console.log(`Got the criteria`);
module.exports.getFilteredDates(lambdaParams.startDate,
lambdaParams.endDate, callback);
console.log(`Returning without the internal function results`);
};
module.exports.function getFilteredDates(startDate, endDate) {
const dateSet = new Set();
return new Promise((resolve, reject) => {
const getAllDates = (isDone) => {
if (isDone) {
const Dates = Array.from(dateSet).join();
resolve(Dates);
return;
}
getTestedDates(startDate, endDate, region, func, memory,
lastDateKey, dateSet).then(getAllDates).catch((error) => {
reject(error);
});
};
lastDateKey = '';
getTestedDates(startDate, endDate, region, func, memory,
lastDateKey, dateSet).then(getAllDates).catch((error) => {
reject(error);
});
});
}
内部函数如下所示:
module.exports.getAvailableDates = (event, context, callback) => {
const lambdaParams = retrieveParametersFromEvent(event);
console.log(`Got the criteria`);
module.exports.getFilteredDates(lambdaParams.startDate,
lambdaParams.endDate, callback);
console.log(`Returning without the internal function results`);
};
module.exports.function getFilteredDates(startDate, endDate) {
const dateSet = new Set();
return new Promise((resolve, reject) => {
const getAllDates = (isDone) => {
if (isDone) {
const Dates = Array.from(dateSet).join();
resolve(Dates);
return;
}
getTestedDates(startDate, endDate, region, func, memory,
lastDateKey, dateSet).then(getAllDates).catch((error) => {
reject(error);
});
};
lastDateKey = '';
getTestedDates(startDate, endDate, region, func, memory,
lastDateKey, dateSet).then(getAllDates).catch((error) => {
reject(error);
});
});
}
更为内部的函数看起来类似,只是它实际查询S3数据库并从中返回与日期条件匹配的键列表
在AWS CloudWatch日志中,我看到了两个打印,并且仅在它们之后才看到内部函数输出。我的理解是,lambda函数并不是在等待内部函数承诺实际执行其工作(包括内部等待承诺),而是返回给我一个糟糕的状态。我能做什么?在执行
回调之前,执行最后一个控制台.log
如果要在退出Lambda之前打印完整语句,则需要包装回调
ad,等待承诺完成:
import getFilteredDates from '../path/to/file';
module.exports.getAvailableDates = (event, context, callback) => {
const lambdaParams = retrieveParametersFromEvent(event);
console.log(`Got the criteria`);
getFilteredDates(lambdaParams.startDate,lambdaParams.endDate)
.then( result => {
console.log(`Returning the internal function results`);
return callback();
})
.catch(callback);
};
我已经更新了代码,使用下面给出的函数
您的getFilteredates
需要重新调整一点:
- 您可以使用第三个参数在内部接受回调并在内部处理承诺链
- 或者公开一个承诺,并在主作用域外部处理回调
让我们重构它,只返回一个承诺并在外部处理回调:
function getFilteredDates(startDate, endDate) {
const dateSet = new Set();
return new Promise((resolve, reject) => {
const getAllDates = (isDone) => {
if (isDone) {
const Dates = Array.from(dateSet).join();
resolve(Dates);
return;
}
getTestedDates(startDate, endDate, region, func, memory,
lastDateKey, dateSet).then(getAllDates).catch((error) => {
reject(error);
});
};
lastDateKey = '';
getTestedDates(startDate, endDate, region, func, memory,
lastDateKey, dateSet).then(getAllDates).catch((error) => {
reject(error);
});
});
}
module.exports = getFilteredDates;
好吧,我知道了,这是我的错。使用状态代码调用回调的内部函数在返回200(成功)时没有null
,并且lambda一次又一次失败。无论如何,我把我的lambda改写成:
module.exports.getAvailableDates = (event, context, callback) => {
const lambdaParams = retrieveParametersFromEvent(event);
getFilteredDates(lambdaParams.startDate, lambdaParams.endDate)
.then(Dates => callback(null, { statusCode: 200, body: Dates}))
.catch(error => callback({ statusCode: 500, body: error}));
};
现在它工作得很好。谢谢你的帮助
Oren你能分享你的承诺吗
code我认为我们中的一方错了另一方。我的问题不是打印,而是lambda返回时没有等待回调,回调在我的内部getFilteredates函数中调用。您好,Marco,像以前一样-这在节点(本地)中对我有效,但在部署为lambda时则不起作用。非常奇怪…你使用的是不支持承诺的node sdk吗?你对Lambda使用的是什么版本的node?运行时:nodejs6.10我在该服务中有一个不同的Lambda,它在给定完全相同的机制的情况下等待承诺实现。我正在努力寻找不同之处。