node-request-interceptor
raw JSON → 0.6.3 verified Sat Apr 25 auth: no javascript
Low-level HTTP/HTTPS/XHR request interception library for Node.js, currently at v0.6.3 (stable). It monkey-patches native modules like http, https, fetch, and XMLHttpRequest to intercept all outgoing requests, allowing custom logic to be applied before responses are sent. Unlike high-level mocking libraries (e.g., nock, sinon), it provides no request matching or routing—just raw interception. It is designed as a building block for tools like MSW. Releases are frequent, with active maintenance and breaking changes in v0.41.0 affecting CJS exports. Ships TypeScript types and supports ESM and CJS.
Common errors
error Error: Cannot find module 'node-request-interceptor/presets/default' ↓
cause Wrong import path; the correct path is 'node-request-interceptor/presets/default' (note the 's' in presets).
fix
Use
import withDefaultInterceptors from 'node-request-interceptor/presets/default'; error TypeError: interceptor.use is not a function ↓
cause You may have imported the wrong export. `RequestInterceptor` is a class, not a function. Ensure you instantiate it with `new RequestInterceptor(...)`.
fix
Correct:
const interceptor = new RequestInterceptor(withDefaultInterceptors); error ReferenceError: XMLHttpRequest is not defined ↓
cause XMLHttpRequest interceptor is used in a Node.js environment without jsdom. XMLHttpRequest is only available in browser-like environments.
fix
Remove the XMLHttpRequest interceptor or ensure jsdom is loaded before using it.
Warnings
breaking In v0.41.0, the CJS bundle no longer contains the named `default` export at `/presets/node`. You must use `require('@mswjs/interceptors/presets/node')` directly without `.default`. ↓
fix For CJS, use `const preset = require('node-request-interceptor/presets/node');` instead of `const { default: preset } = require(...)`.
breaking In v0.40.0, support for `RequestController` with source was added. This may require changes if you rely on the exact handler signature. ↓
fix Update your middleware to handle the new `RequestController` argument if needed.
gotcha The library intercepts all requests by default, which can impact performance if not properly restored. Always call `interceptor.restore()` after use, especially in test cleanup. ↓
fix Use `afterEach(() => interceptor.restore())` in tests, or scope the interceptor to a specific lifecycle.
gotcha XMLHttpRequest interception only works in environments that emulate a browser (e.g., jsdom). In plain Node.js without jsdom, XMLHttpRequest is not available and will error. ↓
fix Only use XMLHttpRequest interceptor if you are in a jsdom environment. For Node.js HTTP/HTTPS, use the default presets.
deprecated Direct import from 'node-request-interceptor/interceptors/ClientRequest' is considered low-level; prefer using presets like '/presets/default' for full coverage. ↓
fix Use `import withDefaultInterceptors from 'node-request-interceptor/presets/default'` instead of manually importing individual interceptors.
Install
npm install node-request-interceptor yarn add node-request-interceptor pnpm add node-request-interceptor Imports
- RequestInterceptor wrong
const { RequestInterceptor } = require('node-request-interceptor')correctimport { RequestInterceptor } from 'node-request-interceptor' - defaultPreset (presets/default) wrong
const { default: preset } = require('node-request-interceptor/presets/default')correctimport withDefaultInterceptors from 'node-request-interceptor/presets/default' - interceptXMLHttpRequest wrong
import interceptXMLHttpRequest from 'node-request-interceptor/interceptors/XMLHttpRequest'correctimport { interceptXMLHttpRequest } from 'node-request-interceptor/interceptors/XMLHttpRequest'
Quickstart
import { RequestInterceptor } from 'node-request-interceptor';
import withDefaultInterceptors from 'node-request-interceptor/presets/default';
const interceptor = new RequestInterceptor(withDefaultInterceptors);
interceptor.use((req) => {
if (req.url.href === 'https://api.example.com/data') {
return {
status: 200,
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ message: 'mocked' }),
};
}
// return undefined to bypass
});
// Now any request to that URL will be intercepted
fetch('https://api.example.com/data').then(res => res.json()).then(console.log);
// Later, restore original modules
interceptor.restore();