Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在azure函数内发出https请求_Javascript_Node.js_Azure Functions - Fatal编程技术网

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();
};