Как выполнить HTTP post-запрос на основе обещаний (NodeJS) изнутри функции Azure?

#node.js #http-post #axios #azure-functions #azure-eventhub

#node.js #http-post #axios #azure-функции #azure-eventhub

Вопрос:

У меня есть сценарий, в котором концентратор событий получает данные и запускается функция Azure для извлечения данных, и функция Azure должна выполнить запрос POST с этими извлеченными данными в качестве полезной нагрузки и получить ответ от сервера. Я использую Http-модуль npm Axios на основе обещаний, поскольку время отклика может варьироваться в зависимости от полезной нагрузки. (Функции Azure находятся в NodeJS); Проблема в том, что запросы Post не проходят

Пробовал вызов async — await для Post-запроса, все еще не работает.

вот код

 module.exports = async function (context, eventHubMessages) {
    context.log(`JavaScript eventhub trigger function called for message array ${eventHubMessages}`);

    var data = {};

    eventHubMessages.forEach((message, index) => {
        context.log(`Processed message ${message}`);
        data = message;
    });

    const axios = require('axios');
    module.exports=async function(context,req){

      let response=  await axios.post('http:example.com/post',     
        { 
          data 
        } 
        )
        .then((res) => {
        context.log(`statusCode: ${res.statusCode}`)
        context.log(res)
        })
        .catch((error) => {
        context.error(error)
        })

        context.log(`Output content: ${res}`);

        }
};
  

Вот функция.json

 {
  "bindings": [
    {
      "type": "eventHubTrigger",
      "name": "eventHubMessages",
      "direction": "in",
      "eventHubName": "name-eventhub",
      "connection": "eventhub-key",
      "cardinality": "many",
      "consumerGroup": "$Default"
    },
    {
      "type": "http",
      "name": "$return",
      "direction": "out"
    }
   ]
}
  

Ожидаемый результат:

 Processed message [object]
statusCode : 200
Output content: response // print response in here
  

Фактический результат:

 Processed message [object]
  

В выходных данных не отображается код состояния или ответ.

Комментарии:

1. Здесь у вас есть еще одна проблема, вам дважды назначили ваш module.exports. Вы хотите сделать это только один раз. Я знаю lambda, а не функции Azure, поэтому я не уверен, как именно сигнатура функции, но вам определенно не нужны два module.exports

Ответ №1:

Если вы await выполняете обещание, вам не нужно цепляться then и catch

 const axios = require('axios');
module.exports=async function(context,req){
  try {
    const response =  await axios.post('http:example.com/post', {data})
    context.log(`statusCode: ${response.statusCode}`);
    context.log(response);
    return response; // or return a custom object using properties from response
  } catch (error) {
    // If the promise rejects, an error will be thrown and caught here
    context.error(error);
  }
};
  

Комментарии:

1. Этот фрагмент кода работает как шарм, я получаю ответ от post-запроса. Но я также получаю сообщение об ошибке [Error] Error: Choose either to return a promise or call 'done'. Do not use both in your script. , и функция завершает работу после ожидания около 5 минут.

2. Эта ошибка была устранена путем вызова context.done() , перед return response; в блоке try.