首页 > 解决方案 > 无法使用 http 模块 nodejs azure 函数执行 http 请求

问题描述

我正在尝试http使用 javascript 在 azure 函数上使用节点模块发出 http 请求,并且由于某种原因http.request没有接收数据(没有错误打印,就像请求被阻止一样)。天蓝色配置或代码有什么问题吗?我是否遗漏了一些非常明显的东西?

代码在本地 js 文件上运行良好

context.log('JavaScript timer trigger function ran!', timeStamp); 按预期打印但context.log("SUCCESS", JSON.parse(data));根本没有打印。

还尝试了不同的库(请求,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);
      });

    }

标签: javascriptnode.jsazurehttpazure-functions

解决方案


我使用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
    return data;
  } catch (err) {
    context.log(err);
    // do something with the error
  }

  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应在dependenciesjson 元素下列出

推荐阅读