You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 --save
    
    这会把依赖写入package.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:25:02