未定义/找到 XMLHttpRequest 模块

这是我的暗号:

var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var xhr = new XMLHttpRequest();
xhr.open("GET", "//URL")
xhr.setRequestHeader("Content-Type: application/json", "Authorization: Basic //AuthKey");
xhr.send();

我得到了一个错误:

Cannot find module 'xmlhttprequest'

When I remove the first line, I am getting:

XMLHttpRequest is not defined

我搜索了所有地方,人们到处提到 Node.js 的问题,但我的 Node 安装是正确的,所以我不确定问题是什么。

277760 次浏览

XMLHttpRequest is a built-in object in 浏览器.

Http 模块是从 Node 发出 HTTP 请求的内置工具。

大多数从节点发出 HTTP 请求的人使用具有更友好 API 的第三方库。两个流行的选择是 Axios(在 Node.js 和浏览器中都可以使用)和 node-fetch(它实现了浏览器中内置的提取 API,是 XMLHttpRequest 的现代替代品。

2022年更新 : Node 18拥有 fetch 默认启用的本地实现。

如果您真的想在 Node.js 中使用 XHR,那么有两个第三方实现。xmlhttprequest(似乎没有得到维护)和 xhr2(在我把它添加到这个答案中时,它有一个更新,但似乎已经被开发人员放弃了)。

  1. Install it with npm,

     npm install xhr2
    
  2. 现在你可以在你的代码 require它。

     var XMLHttpRequest = require('xhr2');
    var xhr = new XMLHttpRequest();
    

由于 预请求模块的最后一次更新是在 两年前附近,在某些情况下它不能像预期的那样工作。

因此,你可以使用 Xhr2模块,换句话说:

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

becomes:

var XMLHttpRequest = require('xhr2');
var xhr = new XMLHttpRequest();

但是... ... 当然,还有更受欢迎的模块,比如 Axios,因为它使用承诺:

// Make a request for a user with a given ID
axios.get('/user?ID=12345').then(function (response) {
console.log(response);
}).catch(function (error) {
console.log(error);
});

使用 Xhr2库,您可以从您的 JS 代码全局覆盖 XMLHttpRequest。这允许您在节点中使用外部库,这些外部库应该在浏览器中运行/假设它们在浏览器中运行。

global.XMLHttpRequest = require('xhr2');