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.

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.
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.
npm install node-request-interceptor
yarn add node-request-interceptor
pnpm add node-request-interceptor

Creates an interceptor with default presets, adds a middleware to mock a specific request, then restores after use.

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();