NodeJS - вызывает асинхронную лямбда-функцию из другой асинхронной лямбда-функции - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь вызвать асинхронную лямбда-функцию из другой лямбда-функции с помощью NodeJS. В конце у меня будет 3 лямбда-функции. 1. Функция запрашивает список пользователей 2. Функция запрашивает детали для каждого пользователя 3. Создайте запись для этого пользователя в БД

Первый запрос работает нормально, я могу получить список пользователей, но не вижуЛюбой признак того, что была задействована вторая лямбдаЛямбда "но ничего не происходит. Кроме того, я не вижу в консоли журнала для второй функции, которая показывает, что она была вызвана.

1 Ответ

2 голосов
/ 08 ноября 2019

Lambdas будут стрелять, проблема в том, что вы не ждете окончания вызовов. Ваш Lambda async, но вы на самом деле не используете await, и, учитывая, что lambda.invoke является вызовом, связанным с вводом / выводом, в вашем коде нет ничего, что заставило бы Lambda ждать завершения каждого вызова.

Вот способ, которым вы можете поставить в очередь внутренние вызовы и заставить свою лямбду ждать результатов:

module.exports.getUserListFromCrowd = async event => {
  console.log('GetUserListFunction')
  const crowdUserGroupOptions = {
    method: 'GET',
    uri: process.env.uri,
    auth: {
      user: process.env.user,
      pass: process.env.pass,
      sendImmediately: false
    },
    json: true,
    headers: {
      Accept: 'application/json'
    }
  };
  const { users } = await rp(crowdUserGroupOptions);
  console.log('Request Sent')
  const requests = users.map(u => 
    new Promise((resolve, reject) => {
      const url = `${u.link.href}&expand=attributes`;
      const params = {
        FunctionName: 'applicationName-stageName-getUserDetailsFromCrowd',
        InvocationType: 'Event',
        Payload: requestLink,
        LogType: 'Tail',
      }
      console.log('Calling Lambda');
      lambda.invoke(params, (err, data) => err ? reject(err) : resolve(data));
    })
  );
  console.log(`Waiting for ${requests.length} requests to finish...`);
  const results = await Promise.all(requests);
  console.log('Lambda results');
  results.forEach((x, i) => console.log(`Request ${i+1} returned ${x}`));
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...