我正在尝试使用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);
};
任何想法?
答案 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);
});
});