Middleware to generate or propagate a unique request ID for each HTTP request in Node.js applications.
- Automatically generate a UUID for incoming HTTP requests.
- Optionally extract an existing ID from an incoming header.
- Attach the ID to the
req
object asreq.requestId
. - Optionally echo the ID back in the response header.
- Fully typed in TypeScript.
npm install http-request-id
or
yarn add http-request-id
or
pnpm add http-request-id
or
deno install http-request-id
or
bun add http-request-id
import http from "node:http";
import requestId from "http-request-id";
const port = 3000;
const assignId = requestId(); // default options
const server = http.createServer((req, res) => {
assignId(req, res, (err?) => {
if (err) {
res.statusCode = 500;
res.end("Internal Server Error");
return;
}
res.writeHead(200, { "Content-Type": "text/plain" });
res.end(`Hello! Your request ID is ${req.requestId}\n`);
});
});
server.listen(port, () => {
console.log(`Listening on http://localhost:${port}`);
});
import express from "express";
import requestId from "http-request-id";
const app = express();
app.use(
requestId({
headerName: "X-Correlation-Id",
setResponseHeader: false,
generator: (req) => {
// Use client-provided header or fallback to UUID
return (req.headers["x-client-id"] as string) ?? randomUUID();
},
})
);
app.get("/", (req, res) => {
res.json({ requestId: req.requestId });
});
app.listen(4000, () => {
console.log("Express server running on port 4000");
});
Creates a middleware function that assigns a unique request ID.
Option | Type | Default | Description |
---|---|---|---|
generator |
(req: IncomingMessage) => string |
randomUUID() |
Custom function to generate or extract a request ID. |
headerName |
string |
"X-http-Request-Id" |
HTTP header name to read/write the request ID. |
setResponseHeader |
boolean |
true |
Whether to echo the request ID back in the response headers. |
(req: IncomingMessage, res: ServerResponse, next: (err?: any) => void) => void
On invocation:
- Reads the header
headerName
from the request (if present). - Otherwise, generates a new ID via
generator
orrandomUUID()
. - Optionally sets the ID on the response header.
- Attaches the ID as
req.requestId
. - Calls
next()
to proceed.
This package is written in TypeScript and exports the following types:
import type { IncomingMessage, ServerResponse } from "node:http";
export interface IncomingMessage {
/** A unique identifier for this request. */
requestId?: string;
}
export type RequestIdOptions = {
generator?: (req: IncomingMessage) => string;
headerName?: string;
setResponseHeader?: boolean;
};
Contributions are welcome! Feel free to open issues or submit pull requests.
MIT License. See LICENSE for details.
Made with ❤️ by Rayen Boussayed