继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

2025年Next.js应用最佳限流方案 top 4

慕桂英3389331
关注TA
已关注
手记 383
粉丝 43
获赞 188

精选

当你为你的 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: '受速率限制的路径。' });  
      });  
    }
  • 应用场景:最适用于传统的服务器上的简单速率限制需求。
2. [@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: '请求成功!' });  
    }
  • 使用场景:非常适合处理高访问量并需要精准控制的应用程序。
4. Vercel Edge Middleware

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。

现在就让你的想法成真!

👉 每周通讯可帮助你创建、启动并发展你的初创公司,创造收入流,提供来自创始人的实用建议。 立即加入!

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP