Ax ios всегда время ожидания AWS Lambda для определенного API - PullRequest
0 голосов
/ 04 марта 2020

Опишите проблему

Я не совсем уверен, является ли это проблемой Axe ios или нет. Следующий код успешно выполняется на моей локальной машине для разработки, но всегда истекает время, когда я запускаю его из облака (например, AWS Lambda). То же самое происходит, когда я запускаю на repl.it.

Я могу подтвердить, что AWS Lambda имеет доступ к Inte rnet и работает для любого другого API, но это:

https://www.target.com.au/ws-api/v1/target/products/search?category=W95362

Пример кода

https://repl.it/repls/AdeptFluidSpreadsheet

const axios = require('axios');

const handler = async () => {
  const url = 'https://www.target.com.au/ws-api/v1/target/products/search?category=W95362';

  const response = await axios.get(url, { timeout: 10000 });

  console.log(response.data.data.productDataList);
}

handler();

Окружающая среда

  • Ax ios Версия: 0.19.2
  • Время выполнения: nodejs12x

Обновление 1

Я попробовал нативное требование ('https'), и оно истекло на локальном и облачном серверах. Пожалуйста, найдите образец кода здесь: https://repl.it/repls/TerribleViolentVolume

const https = require('https');

const url = 'https://www.target.com.au/ws-api/v1/target/products/search?category=W95362';

https.get(url, res => {
  var body = '';

  res.on('data', chunk => {
    body += chunk;
  });

  res.on('end', () => {
    var response = JSON.parse(body);
    console.log("Got a response: ", response);
  });
}).on('error', e => {
  console.log("Got an error: ", e);
});

Опять же, я могу подтвердить, что тот же код работает на любом другом API.

Обновление 2

Я подозреваю, что это что-то на стороне сервера, поскольку оно также ведет себя очень странно с curl.

  • curl от локального -> 403 доступ запрещен
  • curl от локальный с заголовком User-Agent -> success
  • curl с облачного сервера -> 403 доступ запрещен

Это должна быть проверка на стороне сервера, что-то связанное с AkamaiGHost.

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Вы должны попытаться обернуть топором ios вызов в try / catch, возможно, это решит проблему.

const axios = require('axios');

const handler = async () => {
    try {
        const url = 'https://www.target.com.au/ws-api/v1/target/products/search?category=W95362';

        const response = await axios.get(url, { timeout: 10000 });
        console.log(typeof (response));
        console.log(response);

    } catch (e) {
        console.log(e, "error api call");
    }
}

handler();
0 голосов
/ 04 марта 2020

Как подсказал Акшай, вы можете использовать блок try и catch, чтобы получить ошибку. Может быть, это поможет вам.

Вы настроили обработку ошибок для асинхронного вызова?

Чтобы настроить обработку ошибок, выполните следующие действия:

  • Откройте Лямбда-консоль Страница функций .

  • Выберите функцию.

  • В разделе Асинхронный вызов выберите Изменить.

  • Настройте следующие параметры.

  • Максимальный возраст события - максимальное время, в течение которого Lambda сохраняет событие в очереди асинхронных событий, до 6 часов.

  • Попытки повторения - количество попыток лямбды, когда функция возвращает ошибку, от 0 до 2.

  • Выберите Сохранить.

axios - это только HTTP-клиент на основе Promise для браузера и node.js, и, как вы установили timeout: 10000, поэтому я считаю, что время ожидания не закончилось.

Хотя ваш API

https://www.target.com.au/ws-api/v1/target/products/search?category=W95362

работает нормально на браузер и рендеринг JSON данных.

и тайм-аут функции лямбда по умолчанию составляет 15 минут, что я считаю достаточно для ответа. Там может быть другая проблема. Убедитесь, что вы установили другие конфигурации, такие как permissions et c. как предложено в документации. Здесь вы можете проверить ограничения по умолчанию для AWS лямбда.

...