Azure功能(手动触发):发出发布请求

时间:2018-05-18 07:33:10

标签: javascript azure http post azure-functions

我正在尝试使用Azure功能(手动触发器)在javascript中发出一个帖子请求但是我收到以下错误:

mscorlib: One or more errors occurred. Error: Cannot find module 'xmlhttprequest'
    at Function.Module._resolveFilename (module.js:469:15)
    at Function.Module._load (module.js:417:25)
    at Module.require (module.js:497:17)
    at require (internal/module.js:20:19)

这是我的功能:

var XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest;
var xhr = new XMLHttpRequest();

module.exports = function (context, input) {
    context.log('The Request body is:', input);
    context.done();

    var url = "<myurl>";


    xhr.open("POST", url, false);

    xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

    xhr.send(input);
};

任何想法?

2 个答案:

答案 0 :(得分:2)

您需要先安装xmlhttprequest模块。

如果您在门户网站中运行它,请转到https://{yourfunctionappname}.scm.azurewebsites.net/DebugConsole

在cmd控制台中,输入cd ./site/wwwroot, 然后npm install xmlhttprequest

如果您在本地开发,只需在功能项目文件夹和npm install xmlhttprequest中打开cmd。

出现此错误

  

mscorlib:错误:EPERM:不允许操作,在Object.fs.openSync的错误(本机)处打开'D:\ Windows \ system32 \ .node-xmlhttprequest-sync-7048'(fs.js.:641:18 )发送时的Object.fs.writeFileSync(fs.js:1347:33)(D:\ home \ site \ wwwroot \ node_modules \ xmlhttprequest \ lib \ XMLHttpRequest.js:477:10)

open方法异步模式设置为false,这意味着此方法是同步执行的。

它将在进程当前工作目录(cwd)中创建文件。在azure函数中,默认为D:\Windows\system32,由于Sand box limitation,我们无法创建文件。

如果您的函数运行时版本是测试版,我们可以使用process.chdir("d:\\home\\site\\wwwroot\\functionname")将cwd更改为函数文件夹。一切都应该有效。

如果运行时为~1,则在cwd更改后,将发生新错误 - 无法按预期删除同步锁.node-xmlhttprequest-sync-xxxx文件。因此,在执行一次后,函数将在下次被阻止而无法响应。

替代方法是使用异步模式或尝试使用xmlhttprequest以外的模块。

答案 1 :(得分:1)

另一种选择是使用NodeJS的HTTP模块 - https://nodejs.org/api/http.html

在这种情况下,您将从:

开始
var http = require('http');

然后发送数据:

var req = http.request(options, function(response) {
      var str = "";
      response.on("data", function (chunk) {
        str += chunk;
      });

      response.on("end", function () {
        res.json(str);           
      });          
    });