我正在尝试使用节点模块发出 http 请求http
在带有 javascript 的 azure 函数上,出于某种原因http.request
未接收数据(没有打印错误,就像请求被阻止一样)。天蓝色的配置或代码有什么问题吗?我是否遗漏了一些非常明显的东西?
代码在本地 js 文件上运行良好
context.log('JavaScript timer trigger function ran!', timeStamp);
按预期打印,但是context.log("SUCCESS", JSON.parse(data));
根本没有打印。
还尝试了不同的库(request、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 https://www.npmjs.com/package/axios。它支持开箱即用的 async/await,并简化了许多代码以按照您的预期运行,因为它使异步代码像同步代码一样执行。
我认为您可能遇到的主要问题是 JavaScript 中的所有内容都是异步的。因此,Azure Function 运行时在异步函数完成之前就退出了,因为它不像发出 HTTP 请求时的同步代码那样阻塞。如果你想使用回调,你需要调用context.done()
在回调函数内,以便 Azure Functions 在回调完成之前不会退出。通过使用 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 函数上安装包
- 转到 Azure 门户;选择您的Azure功能应用程序
- Select
Platform Features
. Then Advanced Tools (Kudu)
under 开发工具
- 使用文件资源管理器,导航至
site/wwwroot/
。你应该看到一个package.json
文件,以及几个文件夹,每个文件夹都有您的函数名称。
- 从该目录运行
npm install --save axios
- 要确认它有效,请编辑您的
package.json
与铅笔图标。axios
应列在下面dependencies
json元素
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)