#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.