Javascript 在azure函数内发出https请求
我正在尝试一个简单的请求:Javascript 在azure函数内发出https请求,javascript,node.js,azure-functions,Javascript,Node.js,Azure Functions,我正在尝试一个简单的请求: var options = { host: 'hookb.in', path: '/8PMoEa9kbaCXgXYxOmdr5', method: 'POST' }; var req = http.request(options, (res) => { var body = contex
var options = {
host: 'hookb.in',
path: '/8PMoEa9kbaCXgXYxOmdr5',
method: 'POST'
};
var req = http.request(options, (res) => {
var body = context.bindingData.name;
res.on("data", (chunk) => {
body += chunk;
});
res.on("end", () => {
context.res = body;
});
}).on("error", (error1) => {
context.log('error');
context.res = {
status: 500,
body: error1
};
});
req.end();
context.done();
但是,没有响应(这里的目标也没有收到请求)
我做错了什么?是否有特殊的方法在azure函数中创建https请求?
var Jimp = require("jimp");
var http = require('https');
module.exports = async function (context, myBlob) {
context.log("JavaScript blob trigger function processed blob \n Name:", context.bindingData.name, "\n Blob Size:", myBlob.length, "Bytes");
context.log(process.env.ImageConvertedWebHook);
Jimp.read(myBlob, function (err, image) {
image.getBufferAsync(Jimp.MIME_TIFF, function (error, imageData) {
context.log('Node.JS blob trigger function resized ' + context.bindingData.name + ' to ' + image.bitmap.width + 'x' + image.bitmap.height);
context.bindings.outputBlob = imageData;
var options = {
host: 'hookb.in',
path: '/8PMoEa9kbaCXgXYxOmdr5',
method: 'POST'
};
var req = http.request(options, (res) => {
var body = context.bindingData.name;
res.on("data", (chunk) => {
body += chunk;
});
res.on("end", () => {
context.res = body;
});
}).on("error", (error1) => {
context.log('error');
context.res = {
status: 500,
body: error1
};
});
req.end();
context.done();
});
});
};
我也尝试过这样做:
const data = 'buy milk biotch';
var options = {
host: 'hookb.in',
path: '/8PMoEa9kbaCXgXYxOmdr',
method: 'POST',
port: 443,
headers: {
'Content-Type': 'application/json',
'Content-Length': data.length
}
};
const req = https.request(options, res => {
context.log(`statusCode: ${res.statusCode}`)
res.on('data', d => {
context.log(d)
})
})
req.on('error', error1 => {
context.log(error1)
})
req.write(data)
req.end()
似乎是命名冲突问题。代码中有几个变量需要更改:
- 更改如下
var http=require('https')代码>这是一个如何请求Azure AD v2端点在Azure Function V3(节点运行时)中获取访问令牌的工作示例
此函数与OP的区别:函数未标记为异步(module.exports=function
),我使用的是context.done()
让运行时知道异步操作(本例中为https请求)何时完成<代码>上下文。完成()代码>位于两个位置:“结束”和“错误”回调
我认为如果您想使用异步函数,应该使用async/await+承诺,而不是回调-
使用async和await关键字有助于避免这两种错误。
您应该使用Node.js实用程序函数util.promisify来打开
错误首先将回调样式函数转换为等待函数
不是JS开发人员。两个问题:您使用的是函数v1还是v2?还有,这是一个异步函数吗?你有没有具体的理由不使用npm包请求
和请求承诺
?我的原籍国重要吗?我从俄罗斯移民出去时还是个小孩。您的名字非常有趣,正如aderesh的回答所示,Microsoft示例使用“http”作为变量名,没有冲突。“async”关键字可能是问题所在。
var http = require('https');
module.exports = function (context, req) {
var body = "";
body += 'grant_type=' + req.query['grant_type'];
body += '&client_id=' + req.query['client_id'];
body += '&client_secret=' + req.query['client_secret'];
body += '&code=' + req.query['code'];
const options = {
hostname: 'login.microsoftonline.com',
port: 443,
path: '/ZZZZZZZZ-bc69-4c8b-8e91-11f3a181c2bb/oauth2/v2.0/token',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': body.length
}
}
var response = '';
const request = http.request(options, (res) => {
context.log(`statusCode: ${res.statusCode}`)
res.on('data', (d) => {
response += d;
})
res.on('end', (d) => {
context.res = {
body: response
}
context.done();
})
})
request.on('error', (error) => {
context.log.error(error)
context.done();
})
request.write(body);
request.end();
};