get-client-ip
Version:
📍 A Lightweight Utility for Extracting the Real Client IP Address from Incoming HTTP Requests
142 lines (102 loc) • 4.15 kB
Markdown
<div align="center">
<img src="https://github.com/WolfieLeader/npm/blob/main/assets/get-client-ip-banner.svg" align="center" alt="banner" />
<h1 align="center" style="font-weight:900;">get-client-ip</h1>
<p align="center">
A Lightweight Utility for Extracting <br/>
the Real Client IP Address from <br/>
Incoming HTTP Requests
</p>
<a href="https://opensource.org/licenses/MIT" rel="nofollow"><img src="https://img.shields.io/github/license/WolfieLeader/npm?color=DC343B" alt="License"></a>
<a href="https://www.npmjs.com/package/get-client-ip" rel="nofollow"><img src="https://img.shields.io/npm/v/get-client-ip?color=0078D4" alt="npm version"></a>
<a href="https://www.npmjs.com/package/get-client-ip" rel="nofollow"><img src="https://img.shields.io/npm/dy/get-client-ip.svg?color=03C03C" alt="npm downloads"></a>
<a href="https://github.com/WolfieLeader/npm" rel="nofollow"><img src="https://img.shields.io/github/stars/WolfieLeader/npm" alt="stars"></a>
</div>
`get-client-ip` is a lightweight utility that extracts the real client IP address from an incoming HTTP request in Node.js.
It supports common proxy headers (`x-forwarded-for`, `x-real-ip`, etc.) and works seamlessly as both:
- a **standalone utility function**, and
- **Express-compatible middleware**.
It adds `req.clientIp` and `req.clientIps` to the request object when used as middleware — no setup required.
## Features 🌟
- 🌐 **Header-Aware Detection** – Parses standard and cloud-specific proxy headers.
- 🧠 **Smart Parsing** – Handles multiple IPs, comma-separated values, and arrays.
- 🧩 **Middleware-Compatible** – Use as drop-in Express/NestJS middleware.
- 💪🏽 **Works in Standalone Mode** – Can be used as a simple function.
- ⚙️ **Type-Safe & Cross-Compatible** – Fully written in TypeScript with native types. Works in both ESM and CommonJS runtimes.
## Installation 🔥
```bash
npm install get-client-ip@latest
```
> 💡 Works with `npm`, `pnpm`, and `yarn`. You can use it in dev dependencies since it's typically used only for local HTTPS.
## Usage 🪛
### Express 📫
```typescript
import http from 'node:http';
import express from 'express';
import { getClientIp } from 'get-client-ip';
import { env } from './env';
function bootstrap() {
const app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
// Standalone usage:
app.get('/standalone-ip', (req, res) => {
const ip = getClientIp(req);
res.status(200).json({ ip });
});
// Middleware usage:
app.get('/middleware-ip', getClientIp, (req, res) => {
res.status(200).json({ ip: req.clientIp, ips: req.clientIps });
});
http.createServer(app).listen(env.PORT || 3000, () => {
console.log(`🚀 Express server running on: http://localhost:${env.PORT || 3000}`);
});
}
bootstrap();
```
```typescript
import { Controller, Get, Req } from '@nestjs/common';
import type { Request } from 'express';
import { getClientIp } from 'get-client-ip';
@Controller('')
export class PublicController {
@Get('ip')
getIp(@Req() req: Request) {
const ip = getClientIp(req);
return { ip };
}
}
```
The following headers are checked in order of precedence:
```typescript
x-client-ip
x-forwarded-for
forwarded-for
x-forwarded
forwarded
x-real-ip
cf-connecting-ip
true-client-ip
x-cluster-client-ip
fastly-client-ip
x-appengine-user-ip
cf-pseudo-ipv4
```
It also falls back to:
```typescript
req.ip;
req.socket.remoteAddress;
req.connection.remoteAddress;
```
We want to thank [Petar Bojinov](https://github.com/pbojinov) for the inspiration.
Want to contribute or suggest a feature?
- Open an issue or feature request
- Submit a PR to improve the packages or add new ones
- Star ⭐ the repo if you like what you see
This project is licensed under the [MIT License](https://opensource.org/licenses/MIT).
Thank you!