我正在尝试使用nodeJS创建Azure函数,但是当我调用https API时会收到错误消息。
是否可以通过azure函数进行HTTPS调用?
这是我的代码
const https = require('https');
const querystring = require('querystring');
module.exports = async function (context, req) {
if (req.query.accessCode || (req.body && req.body.accessCode)) {
var options = {
host: 'api.mysite.com',
port: 443,
path: '/oauth/access_token',
method: 'POST'
};
var postData = querystring.stringify({
client_id : '1234',
client_secret: 'xyz',
code: req.query.accessCode
});
var req = https.request(options, function(res) {
context.log('STATUS: ' + res.statusCode);
context.log('HEADERS: ' + JSON.stringify(res.headers));
res.on('data', function (chunk) {
context.log('BODY: ' + chunk);
});
});
req.on('error', function(e) {
context.log('problem with request: ' + e.message);
});
req.write(postData);
req.end();
context.res = {
status: 200,
body: "Hello " + (req.query.accessCode)
};
} else {
context.res = {
status: 400,
body: "Please pass a name on the query string or in the request body"
};
}
context.done();
};
我收到一个错误,但是在控制台上看不到任何错误,如果我注释所有的https调用,它也可以正常工作,并且我可以在屏幕上看到Hello消息。
答案 0 :(得分:3)
有两点要解决
删除context.done();
。参见Azure document。
如果您的函数使用JavaScript异步函数声明(在2.x版的Node 8+中可用),则无需使用context.done()。隐式调用context.done回调。
将您的https.rename重命名为var myReq = https.request(options, function(res)
。
由于函数声明了内置的req
对象,因此名称冲突引起错误。
答案 1 :(得分:0)
这是可能的,下面是一个如何向Azure AD v2令牌终结点发出请求的示例(我假设您正在尝试执行类似的操作):
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: '/ZZZ920d8-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();
};
区别在于-函数不是异步module.exports = function
我相信您的问题是:
您应该使用Node.js实用程序函数util.promisify将错误优先的回调样式函数转换为等待的函数。