Javascript AWS 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.

我有一个函数在节点环境中工作得非常好。该函数使用承诺、S3调用和then and catch调用回调,每个回调中包含相关的200/500状态码和消息体

现在我将其部署为一个lambda函数,其周围有一个包装器,如下所示:

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,它在给定完全相同的机制的情况下等待承诺实现。我正在努力寻找不同之处。