https://github.com/express-rate-limit/rate-limit-postgresql
A PostgreSQL store for express-rate-limit middleware
https://github.com/express-rate-limit/rate-limit-postgresql
express-middleware nodejs postgresql rate-limiting security
Last synced: about 1 month ago
JSON representation
A PostgreSQL store for express-rate-limit middleware
- Host: GitHub
- URL: https://github.com/express-rate-limit/rate-limit-postgresql
- Owner: express-rate-limit
- License: mit
- Created: 2023-09-08T07:37:08.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2025-04-01T06:31:01.000Z (2 months ago)
- Last Synced: 2025-04-23T11:02:05.200Z (about 2 months ago)
- Topics: express-middleware, nodejs, postgresql, rate-limiting, security
- Language: PLpgSQL
- Homepage: https://www.npmjs.com/package/@acpr/rate-limit-postgresql
- Size: 792 KB
- Stars: 12
- Watchers: 4
- Forks: 1
- Open Issues: 1
-
Metadata Files:
- Readme: readme.md
- Changelog: changelog.md
- Contributing: contributing.md
- License: license.md
- Code of conduct: code_of_conduct.md
Awesome Lists containing this project
README
# rate-limit-postgresql
[](code_of_conduct.md)
A [`PostgreSQL`](https://www.postgresql.org/) store for the
[`express-rate-limit`](https://github.com/nfriedly/express-rate-limit)
middleware.## Installation
From the npm registry:
```sh
# Using npm
> npm install --save @acpr/rate-limit-postgresql
# Using yarn or pnpm
> yarn/pnpm add @acpr/rate-limit-postgresql
```## Usage
Functional examples for using `rate-limit-postgresql` are found in the
[following repository](https://github.com/adrianprelipcean/express-rate-limit-postgresql-examples)```js
let rateLimit = require('express-rate-limit')
let postgresStores = require('@acpr/rate-limit-postgresql')let limiter = new RateLimit({
store: new postgresStores.PostgresStore(
{
user: 'postgres',
password: 'postgres',
host: 'localhost',
database: 'rate-limit',
port: 5432,
},
'aggregated_store',
),
windowMs: 15 * 60 * 1000, // 15 minutes
max: 3, // Limit each IP to 3 requests per `window` (here, per 15 minutes)
message:
'Too many accounts created from this IP, please try again after 15 minutes',
standardHeaders: 'draft-7', // Set `RateLimit` and `RateLimit-Policy`` headers
legacyHeaders: false,
})// apply to all requests
app.use(limiter)
```### Importing
This library is provided in ESM as well as CJS forms, and works with both
Javascript and Typescript projects.**This package requires you to use Node 16 or above.**
Import it in a CommonJS project (`type: commonjs` or no `type` field in
`package.json`) as follows:```ts
let postgresStores = require('@acpr/rate-limit-postgresql')
```Import it in a ESM project (`type: module` in `package.json`) as follows:
```ts
import postgresStores from '@acpr/rate-limit-postgresql'
```## Configuration
### Types of Postgres Stores
There are two different types of Postgres Stores:
1. `PostgresStoreAggregatedIP` (with the default `PostgresStore` constructor)-
which aggregates the IP count in the table, as shown in the following table| key | session_id | count |
| ----------- | ---------- | ----- |
| 192.168.1.1 | 1 | 3 |
| 192.168.2.1 | 1 | 1 |2. `PostgresStoreIndividualIP` - which stores the IP of each request in a
separate row (as shown in the following table) and performs the aggregation
at a separate step| id | key | session_id | event_time |
| --- | ----------- | ---------- | ------------------------- |
| 1 | 192.168.1.1 | 1 | 2023-09-13T07:40:09+00:00 |
| 2 | 192.168.1.1 | 1 | 2023-09-13T07:40:10+00:00 |
| 3 | 192.168.1.1 | 1 | 2023-09-13T07:40:11+00:00 |
| 4 | 192.168.2.1 | 1 | 2023-09-13T07:40:11+00:00 |> Note: The database uses UUID as a data type for IDs, the tables contain
> integers as IDs to keep illustration simple.### Constructor
Both types of store take the same input in their constructor
- `config` - The database configuration as specified in the
[node-postgres](https://node-postgres.com/apis/client) configuration.
- `prefix` - The unique name of the session (persisted in the database). Used by
the double-count check to avoid false-positives when a key is counted twice,
but with different prefixes.## Installation
Project license is specified in the [license file](license.md). Third party
licenses are located in the [third_party_licenses folder](third_party_licenses)