AWS Lambda Promise.all никогда не возвращается или не работает с ним - PullRequest
0 голосов
/ 11 декабря 2018

Итак, у меня есть код ниже.Когда я запускаю его локально, он работает как положено.Когда я публикую его в lambda, он не может получить мои S3 элементы.Я вижу, что для моего запроса создаются обещания, но return Promise.all(ps) никогда не возвращается с ожидаемыми значениями.Я пытался изменить это несколькими различными способами, но всегда ничего.Я обновил свой локальный env, чтобы он был таким же, как лямбда (узел 8.10 и aws-sdk 2.290.0), и все же он работает локально, но не при размещении.

Журналы Cloudwatch показывают, что он завершился и не содержит ошибок и заканчивается в ~ 100 мс.

Я призываю получить 20 объектов из s3 размером 8К;Я добавил перерыв, чтобы получить только 1 запись, и то же самое происходит ... ничего.

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

Проблема решена.Над этим модулем была еще одна функция-обертка, которая была асинхронной, но не использовала ключевое слово await.Ошибка новичка!

1 Ответ

0 голосов
/ 13 декабря 2018

Проблема решена.Над этим модулем была еще одна функция-обертка, которая была асинхронной, но не использовала ключевое слово await.Ошибка новичка!Спасибо @ Evert

...