无法使用 http module nodejs azure 函数执行 http 请求



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

代码在本地 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);
});
}

我用Axios重写了你的代码。它支持开箱即用的异步/等待,并简化了许多代码,使其按照您的期望运行,因为它使异步代码像同步代码一样执行。

我认为您可能遇到的主要问题是 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.jsonaxios应列在 JSON 元素dependencies

我一直保持基于您的代码回调。 我从定义中删除了async名字对象,并在resp.end处理程序中添加了对context.done的调用(这会在函数结束时向函数主机发出信号)

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关键字调用它们来实现

最新更新