2025年Next.js应用最佳限流方案 top 4
精选
当你为你的 Next.js 应用添加速率限制时,这里有一些你可以考虑的好方案供你参考。
2025年针对Next.js应用的四大最佳限流解决方案
1.[express-rate-limit](https://www.npmjs.com/package/express-rate-limit)(限制请求速率的 Express 中间件)
一种流行的中间件,用于限制基于 Express 的 API 的请求。
- 它是怎么运作的:控制客户端在一个时间段内能发送的请求次数。
- 如何集成:你可以这样在你的API路由中使用它。
import rateLimit from 'express-rate-limit';
const apiLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15分钟
max: 100, // 每个窗口最多允许100次请求
message: '请求过多,请稍后再试或查阅文档了解详情。',
});
export default function handler(req, res) {
apiLimiter(req, res, () => {
res.status(200).json({ message: '受速率限制的路径。' });
});
}
- 应用场景:最适用于传统的服务器上的简单速率限制需求。
[@upstash/ratelimit](https://upstash.com/blog/nextjs-ratelimiting)
Next.js推荐用于无服务器环境。
- 它是怎么工作的:它与 Vercel KV 一起工作,就像一个基于 Redis 的存储系统。
- 如何集成:
import { Ratelimit } from '@upstash/ratelimit';
import { kv } from '@vercel/kv';
const rateLimit = new Ratelimit({
redis: kv,
limiter: Ratelimit.slidingWindow(5, '10 s'), // 5 次请求每 10 秒钟
});
export default async function handler(req, res) {
const { success } = await rateLimit.limit(req.ip);
if (!success) return res.status(429).json('请求过于频繁');
res.status(200).json({ message: '请求处理成功' });
}
3. 基于 Redis 的方案
借助 Redis 实现快速又可靠的速率限制。
- 它是怎么工作的:使用 Redis 键跟踪请求信息。
- 集成:
import Redis from 'ioredis';
const redis = new Redis();
const LIMIT = 5; // 5 次请求
const DURATION = 60; // 在 60 秒之内
export default async function handler(req, res) {
const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
const key = `rate-limit:${ip}`;
const current = await redis.incr(key);
if (current === 1) await redis.expire(key, DURATION);
if (current > LIMIT) return res.status(429).json('请求过多,请稍后再试');
res.status(200).json({ message: '请求成功!' });
}
- 使用场景:非常适合处理高访问量并需要精准控制的应用程序。
Vercel 边缘中间件,了解更多请参阅 文档
在边缘限制速率,从而加快性能。
- 它是怎么工作的:在用户附近运行中间件程序,减少延迟时间。
- 集成:如何集成
import { Ratelimit } from '@upstash/ratelimit';
import { kv } from '@vercel/kv';
// 创建一个新的速率限制器
const rateLimit = new Ratelimit({
redis: kv,
limiter: Ratelimit.slidingWindow(5, '10 s'),
});
// 导出默认的中间件函数,处理请求
export default async function middleware(request) {
// 定义请求的IP地址,如果不存在则用默认的IP地址127.0.0.1
const ip = request.ip || '127.0.0.1';
// 限制请求的速率
const { success } = await rateLimit.limit(ip);
// 返回成功则继续处理请求,否则重定向到'/blocked'页面
return success ? NextResponse.next() : NextResponse.redirect('/blocked');
}
- 应用场景:非常适合托管在 Vercel 上且需要快速边缘速率限制的应用程序。
- 对于基本需求:试试
express-rate-limit
。 - 对于无服务器应用:用
@upstash/ratelimit
。 - 对于高流量应用:试试基于 Redis 的方案。
- 对于在 Vercel 上的应用:用 Vercel 边缘中间件。
想为你的想法建立一个MVP吗?
联系我的MVP构建团队!
我可以在12天内为你提供一个完全功能的MVP。
现在就让你的想法成真!
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦