XMLHttpRequest module not defined/found

Javascriptnode.jsXmlhttprequest

Javascript Problem Overview


This is my code:

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

I am getting the error:

Cannot find module 'xmlhttprequest'

When I remove the first line, I am getting:

XMLHttpRequest is not defined

I have searched all over and people have mentioned a problem with Node.js here and there but my installation of Node was correct so I'm not sure what the issue is.

Javascript Solutions


Solution 1 - Javascript

XMLHttpRequest is a built-in object in web browsers.

It is not distributed with Node. The http module is the built-in tool for making HTTP requests from Node.

Most people making HTTP requests from node use a third party library with a friendlier API. Two popular choices are Axios (for use both in Node.js and browsers) and node-fetch (which implements the fetch API which is built into browsers and is a modern replacement for XMLhttpRequest.

2022 update: Node 18 has a native implementation of fetch enabled by default.

If you really want to use XHR in Node.js then there are a couple of third party implementations. xmlhttprequest (which seems to be unmaintained) and xhr2 (which has had an update this year).

  1. Install it with npm,

     npm install xhr2
    
  2. Now you can require it in your code.

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

Solution 2 - Javascript

Since the last update of the xmlhttprequest module was around 2 years ago, in some cases it does not work as expected.

So instead, you can use the xhr2 module. In other words:

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

becomes:

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

But ... of course, there are more popular modules like Axios, because -for example- uses promises:

// 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);
});

Solution 3 - Javascript

With the xhr2 library you can globally overwrite XMLHttpRequest from your JS code. This allows you to use external libraries in node, that were intended to be run from browsers / assume they are run in a browser.

global.XMLHttpRequest = require('xhr2');

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionwmashView Question on Stackoverflow
Solution 1 - JavascriptQuentinView Answer on Stackoverflow
Solution 2 - Javascriptrobe007View Answer on Stackoverflow
Solution 3 - JavascriptRok PovsicView Answer on Stackoverflow