fetch-h2: HTTP/1+2 Fetch API for Node.js
fetch-h2 is a robust Node.js implementation of the standard Fetch API, providing a familiar, browser-like interface for making HTTP requests within a Node.js environment. It transparently handles both HTTP/1.1 and HTTP/2 connections, automatically negotiating the protocol via ALPN for `https://` URLs, and defaulting to HTTP/1.1 for `http://` unless `http2://` is explicitly used for plain-text HTTP/2 (h2c). The library is currently stable at version 3.0.2 and receives regular maintenance, including bug fixes and dependency updates. Key differentiators include its close adherence to the Fetch API standard, transparent socket re-use and session management, built-in in-memory cookie support per context, and automatic decoding of `br`, `gzip`, and `deflate` encodings. It offers a higher-level, more developer-friendly abstraction for HTTP/2 client requests in Node.js compared to the lower-level native `http2` module. Since version 3.0.0, it requires Node.js 12 or newer.
Common errors
-
TypeError: fetch is not a function
cause Attempting to use `require()` for the `fetch` function in a CommonJS module context, which is typically an ESM-only export.fixUse ESM `import { fetch } from 'fetch-h2'` in a module with `"type": "module"` in package.json or with an `.mjs` extension. -
TimeoutError: The operation timed out
cause The HTTP request exceeded the configured timeout duration, leading to an automatic cancellation.fixIncrease the timeout value in the `init` object (e.g., `{ timeout: 10000 }`) or investigate network/server performance issues. -
Error: HTTP error! status: 404
cause The requested resource was not found on the server, or another non-2xx/3xx status code was returned indicating an application-level error.fixCheck the URL, verify the resource exists, and ensure the server is configured to return expected status codes. Add specific error handling for different HTTP statuses.
Warnings
- breaking Version 3.0.0 and above requires Node.js 12 or newer. Older Node.js versions (e.g., Node 10) are not supported.
- breaking Previous versions (1.x, 2.x) had their own Node.js engine requirements (1.0.0 required Node 10, 2.0.0 required Node 10.4). Always check the engine requirement for your specific version.
- gotcha Cookies are handled per-context and stored only in-memory. They are not persisted to disk or automatically shared across different application runs.
- gotcha By default, `fetch-h2` will use HTTP/1.1 for `http://` URLs. To explicitly use plain-text HTTP/2 (h2c), you must prefix the URL with `http2://`.
- gotcha Timeouts are internally implemented using `AbortController` signals. When a timeout occurs, a `TimeoutError` (which extends `AbortError`) is thrown.
Install
-
npm install fetch-h2 -
yarn add fetch-h2 -
pnpm add fetch-h2
Imports
- fetch
const fetch = require('fetch-h2')import { fetch } from 'fetch-h2' - setup
import setup from 'fetch-h2'
import { setup } from 'fetch-h2' - AbortController
import { AbortController } from 'fetch-h2' - Response
import { Response } from 'fetch-h2'
Quickstart
import { fetch } from 'fetch-h2';
async function fetchData() {
const targetUrl = process.env.API_URL ?? 'https://httpbin.org/get';
try {
const response = await fetch(targetUrl, {
headers: {
'User-Agent': 'fetch-h2-checklist-day-example/1.0'
}
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
console.log('Successfully fetched data:', data.url, data.headers['User-Agent']);
console.log('Headers:', response.headers.get('Content-Type'));
} catch (error) {
console.error('Failed to fetch:', error.message);
}
}
fetchData();