Azure Function(手动触发)发送POST请求报错:找不到xmlhttprequest模块
解决Azure Function中Node.js调用POST请求时的模块缺失问题
嗨,这个报错原因很明确——xmlhttprequest不是Node.js的内置模块,Azure Function的Node.js运行环境默认没装这个包,所以运行时找不到它。先看看你遇到的报错信息:
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); };
给你两个解决思路,按需选择:
方案一:安装xmlhttprequest依赖包
如果你坚持要用XMLHttpRequest的写法,得手动安装这个包:
- 打开你的Azure Function项目根目录(就是放着
function.json的文件夹所在的上级目录)的终端,运行:
这会把依赖写入npm install xmlhttprequest --savepackage.json文件 - 重新部署你的Function:不管是用VS Code的Azure扩展还是其他部署工具,确保
package.json和生成的node_modules文件夹一起上传,或者让Azure在部署时自动执行npm install来安装依赖
方案二:改用Node.js内置的http/https模块(更推荐)
其实Node.js本身就自带了http和https模块,完全不需要额外装包,而且写法也很清晰。另外要注意你原来的代码里context.done()放在了发送请求之前,这会导致函数提前终止,请求可能还没完成就被掐断了,我帮你调整了代码逻辑:
// 目标URL是http开头就用http模块,https开头就用https模块 const http = require('http'); // const https = require('https'); module.exports = function (context, input) { context.log('The Request body is:', input); const targetUrl = "<myurl>"; // 解析URL,自动提取主机、路径等信息 const urlDetails = new URL(targetUrl); const requestOptions = { hostname: urlDetails.hostname, port: urlDetails.port || (urlDetails.protocol === 'https:' ? 443 : 80), path: urlDetails.pathname + urlDetails.search, method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': Buffer.byteLength(input) } }; // 创建请求 const req = http.request(requestOptions, (response) => { context.log(`请求响应状态码: ${response.statusCode}`); // 接收响应数据 response.on('data', (chunk) => { context.log('响应内容:', chunk.toString()); }); // 响应结束后再结束函数 response.on('end', () => { context.log('请求完成'); context.done(); }); }); // 监听请求错误 req.on('error', (err) => { context.log.error('请求出错:', err.message); context.done(err); // 出错时传递错误信息 }); // 发送请求数据 req.write(input); req.end(); };
这个写法不需要额外依赖,而且能确保请求完成后再结束函数,避免提前终止的问题。
内容的提问来源于stack exchange,提问作者Ngovkevin
相关产品推荐
相关产品推荐

