如何从 Azure 函数内部发出基于承诺的 HTTP 发布请求 (NodeJS)?

Posted

技术标签:

【中文标题】如何从 Azure 函数内部发出基于承诺的 HTTP 发布请求 (NodeJS)?【英文标题】:How to make a promise based HTTP post request (NodeJS) from inside an Azure function? 【发布时间】:2019-09-14 08:24:29 【问题描述】:

我有一个场景,事件中心正在接收数据并且触发 Azure 函数来获取数据,Azure 函数应该使用获取的数据作为有效负载发出 POST 请求并从服务器获取响应。我正在使用基于 Promise 的 npm Http 模块“Axios”,因为响应时间可能因负载而异。 (Azure 函数在 NodeJS 中);问题是,没有 Post 请求通过

尝试过异步 - 等待 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`);

        
;

这里是function.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]

输出中没有显示状态代码或响应。

【问题讨论】:

这里还有一个问题,你的 module.exports 被分配了两次。你只想这样做一次。我知道 lambda,而不是 azure 函数,所以我不确定函数签名到底如何,但你绝对不想要两个 module.exports 【参考方案1】:

如果你await承诺,你不需要链接thencatch

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);
  
;

【讨论】:

这段代码就像魅力一样,我从发布请求中得到响应。但我也收到一个错误[Error] Error: Choose either to return a promise or call 'done'. Do not use both in your script. 并且该函数在等待大约 5 分钟后自行终止。 此错误已通过在 try 块中调用 context.done() 之前的 return response; 解决。

以上是关于如何从 Azure 函数内部发出基于承诺的 HTTP 发布请求 (NodeJS)?的主要内容,如果未能解决你的问题,请参考以下文章

如何让控制器等待从角度服务解决的承诺

从 axios.get 返回的承诺 [重复]

如何创建从回调函数返回承诺的函数[重复]

如何将软件构建从 Azure DevOps 部署到内部服务器?

如何从 pg-promise 中的 db.any() 承诺中获取价值?

从 Azure 发出 BadRequest 的持续推送消息