Невозможно выполнить запрос http с помощью функции лазера nodejs модуля http - PullRequest
1 голос
/ 05 июня 2019

Я пытаюсь сделать http-запрос с модулем узла http для функции azure с javascript и по какой-то причине http.request не получает данные (не выводится сообщение об ошибке, так как запрошенный заблокирован). Что-то не так с конфигурацией Azure или кодом? Я что-то упускаю из виду?

Код работает нормально в локальном файле js

context.log('JavaScript timer trigger function ran!', timeStamp); напечатано как положено, но context.log("SUCCESS", JSON.parse(data)); не напечатано вообще.

Также безуспешно пробовал разные библиотеки (request, axios)


    module.exports = async function (context, myTimer) {
        var timeStamp = new Date().toISOString();

        if (myTimer.IsPastDue)
        {
            context.log('JavaScript is running late!');
        }
        context.log('JavaScript timer trigger function ran!', timeStamp);  

        const http = require('http');
        http.get('http://myAPIurl', (resp) => {
        let data = '';

        // A chunk of data has been recieved.
        resp.on('data', (chunk) => {
          data += chunk;
        });

        // The whole response has been received. Print out the result.
        resp.on('end', () => {
          context.log("SUCCESS", JSON.parse(data));
        });

      }).on("error", (err) => {
      context.log("ERROR: " + err.message);
      });

    }

Ответы [ 3 ]

1 голос
/ 05 июня 2019

Я сохранил ваш код обратного вызова. Я удалил прозвище async из определения и добавил вызов context.done (это сигнализирует хост функций после завершения вашей функции) в вашем обработчике resp.end

module.exports = function (context, myTimer) {
    var timeStamp = new Date().toISOString();

    if (myTimer.IsPastDue)
    {
        context.log('JavaScript is running late!');
    }
    context.log('JavaScript timer trigger function ran!', timeStamp);  

    const https = require('https');
    https.get('https://raw.githubusercontent.com/LearnWebCode/json example/master/animals-1.json', (resp) => {
    let data = '';

    // A chunk of data has been recieved.
    resp.on('data', (chunk) => {
      data += chunk;
    });

    // The whole response has been received. Print out the result.
    resp.on('end', () => {
      context.log("SUCCESS", JSON.parse(data));
      context.done(null, data);
    });

  }).on("error", (err) => {
    context.log("ERROR: " + err.message);
  });

}

Другой вариант - сохранить функцию как async, но вам нужно будет заменить обратные вызовы вызовами на основе promise. В некоторых сценариях этого можно достичь, обернув их с помощью util.promisify , а затем вызвав их с ключевым словом await

1 голос
/ 05 июня 2019

Я переписал ваш код, используя Axios . Он имеет встроенную поддержку async / await и упрощает работу кода, как и следовало ожидать, поскольку асинхронный код работает как синхронный код.

Я думаю, что главная проблема, с которой вы, возможно, сталкивались, в том, что все в JavaScript асинхронно. В результате время выполнения функции Azure завершалось до завершения асинхронной функции, поскольку она не блокировалась, как синхронный код при выполнении HTTP-запроса. Если вы хотите использовать обратные вызовы, вам нужно вызвать context.done() внутри функции обратного вызова, чтобы функция Azure не закрывалась до завершения обратного вызова. Используя async / await, вы можете гарантировать, что ваш код будет блокироваться по HTTP-запросу до тех пор, пока он не получит ответ или тайм-аут. В приведенном ниже примере Axios вернет объект ответа, который включает данные в качестве элемента. Я извлекаю данные с помощью операции деконструкции, которая позволяет мне регистрировать data.

const axios = require('axios');
const url = 'https://google.com';

module.exports = async function (context, myTimer) {

  try {
    const { data } = await axios.get(url);
    context.log(data);
    // do something with the data
  } catch (err) {
    context.error(err);
  }

  context.done();
}

Чтобы установить пакет в функции Azure

  1. Перейти на портал Azure; выберите приложение-функцию Azure
  2. Выберите Platform Features. Тогда Advanced Tools (Kudu) под Средства разработки
  3. Используя файловый менеджер, перейдите к site/wwwroot/. Там вы должны увидеть файл package.json и несколько папок с именами ваших функций.
  4. Из этого каталога запустите npm install --save axios
  5. Чтобы подтвердить, что это работает, отредактируйте package.json с помощью значка карандаша. axios должно быть указано в dependencies элемент json
0 голосов
/ 05 июня 2019

Хорошо, это будет звучать странно, но я создал новую функцию, расположенную на сервере Западного ЕС (на сервере США), и он работал, URL-адреса запросов направлены на сервер ЕС.

Так что это проблема сетиЛазурные?я действительно не знаю

...