Запланированная лямбда-функция не может совершать сторонние вызовы API - PullRequest
0 голосов
/ 14 января 2019

У меня 3 функции.

  1. Cron задание лямбда-функции
  2. Управляемая событиями функция, которая определяет, когда новая запись добавляется в DynamoDB
  3. Функция многократного использования, которая в данный момент вызывается двумя вышеуказанными функциями

Функция задания Cron

export async function scheduledFunction() {
    const detailsHistory = await sharedFunction(param1);
}

Функция, управляемая событиями

export async function eventFunction(event) {
    event.Records.forEach(async record => {
        if (record.eventName === 'INSERT') {
            await sharedFunction(param1)
        }
    }
}

Функция, вызываемая как функцией события, так и запланированной

const sharedFunction = async (param1) {
    const apiUrl = 'xxxxxx';
    const details = await axios.get(apiUrl, {
        headers: {
            'x-api-key': xxxx
        }
    }); 
}

Функция события работает, когда DynamoDB имеет новую вставку, а затем вызывает сторонний API, который работает как ожидалось

Запланированная функция срабатывает каждые 4 часа, работает и попадает в sharedFunction, но когда она достигает вызова API await axios.get, она просто ничего не делает, я не получаю никаких ошибок в CloudWatch. Я поместил console.logs() до и после звонка, и он записывает звонок до, но ничего после.

1 Ответ

0 голосов
/ 14 января 2019

Вы всегда должны помещать асинхронный код в блок try ... catch. Также forEach не будет работать с обещанием, что вам нужно будет использовать for цикл. Попробуйте это:

export async function eventFunction(event) {
  try {

    for (let record of event.Records) {
      if (record.eventName === 'INSERT') {    
        await sharedFunction(param1)
      }
    }
  }
  catch (err) {
    console.log(err);
    return err;
  }
}

Общая функция:

const sharedFunction = async (param1) => {
  try {
    const apiUrl = 'xxxxxx';
    return await axios.get(apiUrl, {
        headers: {
            'x-api-key': xxxx
        }
    });

  }
  catch (err) {
    return err;   
  } 
}
...