JavaScript (Node.js) 中的速率限制:express-rate-limit 库完全指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

JavaScript (Node.js) 中的速率限制:使用 express-rate-limit 保护 API

在现代 Web 开发中,保护服务器应用程序免受过载和恶意攻击是一项至关重要的任务。最有效的保护机制之一是 速率限制。这种方法允许控制客户端(IP 地址、用户或会话)在特定时间段内向服务器发送的请求数量。在 Node.js 和 Express 生态系统中,实现速率限制最流行且最可靠的库是 express-rate-limit。



什么是速率限制,为什么需要它?

速率限制是一种用于管理网络流量的技术。它可以防止服务器资源被滥用,保护免受以下攻击:

  • DoS/DDoS 攻击 — 通过大量请求使服务器瘫痪。
  • 暴力破解攻击 — 尝试猜测密码或访问令牌。
  • 网络爬虫 — 自动从网站收集数据。
  • 过度使用 API — 单个客户端消耗超出允许范围的资源。

如果没有速率限制,您的应用程序可能会变得脆弱且不稳定,尤其是在用户群增长时。



express-rate-limit 库

express-rate-limit 是 Express.js 的一个中间件,它提供了一种简单而灵活的方式来限制请求。它嵌入到请求处理链中,并自动跟踪每个客户端的访问次数。该库支持多种存储方式(内存、Redis、MongoDB 等),使其适用于分布式系统。



安装

首先,通过 npm 安装该库:

npm install express-rate-limit


基本用法

最简单的示例是限制应用程序所有路由,每个 IP 地址每小时最多 100 个请求:

const rateLimit = require('express-rate-limit');const express = require('express');const app = express();

// 创建限制器const limiter = rateLimit({ windowMs: 60 * 60 * 1000, // 1 小时 max: 100, // 最多 100 个请求 message: '来自您 IP 的请求过多。请稍后再试。', standardHeaders: true, // 返回标准的 RateLimit-* 标头 legacyHeaders: false, // 禁用 X-RateLimit-* 标头});

// 应用于所有路由app.use(limiter);

app.get('/', (req, res) => { res.send('首页');});

app.listen(3000, () => { console.log('服务器已启动,端口 3000');});


为不同路由进行配置

通常,不同的端点需要不同的限制。例如,可以为登录路由设置更严格的限制:

const rateLimit = require('express-rate-limit');

// 对 /api/login 的严格限制const loginLimiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15 分钟 max: 5, // 5 次登录尝试 message: { error: '登录尝试过多。请在 15 分钟后重试。', retryAfter: 15 }, keyGenerator: (req) => { // 使用 IP + 用户名进行更精确的封锁 return req.ip + req.body.username; }});

app.post('/api/login', loginLimiter, (req, res) => { // 身份验证逻辑 res.send('登录成功');});

// 对公共 API 的宽松限制const apiLimiter = rateLimit({ windowMs: 60 * 1000, // 1 分钟 max: 30, // 每分钟 30 个请求 message: '超出 API 请求限制。'});

app.use('/api/', apiLimiter);


高级功能

自定义存储

默认情况下,数据存储在进程内存中。对于生产环境,建议

推荐