如何在strapi自定义路由中使用express-rate-limit作为中间件

问题描述 投票:0回答:1

我正在尝试在 Strapi 自定义路由中添加一个中间件,它可以控制来自特定 IP 的请求数量>为此,我正在使用express-rate-limit,但它不起作用

我试过这个:

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

module.exports = () => {
  return async (ctx, next) => {
    await next();
    rateLimit({
      windowMs: 60 * 1000, // 1 minutes
      max: 3, // Limit each IP to 3 requests per windowMs
      message: "too many requests",
    });
  };
};

自定义路线:

    {
      method: "GET",
      path: "/v1/customer/social/accounts",
      handler: "customer.getSocialAccounts",
      config: {
        auth: false,
        middlewares: ["global::jwtVerify", "global::rate-limit"],
      },
    },

但是它没有给我想要的输出,就像如果我点击了超过 3 个请求,那么它应该给出太多请求错误(429)。

routes middleware strapi express-rate-limit
1个回答
0
投票

我发现了一些潜在的问题:

  1. express-rate-limit 旨在与 express 配合使用,而 Strapi 似乎使用 koa。它们做类似的事情,但它们有足够的不同,为其中一个编写的中间件不太可能只与另一个一起工作。

  2. 您的示例代码立即调用 next(),这意味着限制器将没有机会实际限制请求。

  3. 您的示例代码似乎在每个请求上创建一个新的rateLimit中间件实例,这使用默认存储意味着每个请求的命中计数重置为0。

  4. 您的示例代码没有对其创建的rateLimit中间件实例执行任何操作,因此命中计数永远不会增加到超过0,并且永远不会调用限制。

这里有一个使用 koa-connect 的潜在解决方案,它将 Express 风格的中间件转换为与 Koa 一起使用。我还没有测试过它,但希望它能起作用,或者至少为你指明正确的方向。

const rateLimit = require("express-rate-limit");
const c2k = require('koa-connect');

module.exports = () => {
  return c2k(rateLimit({
      windowMs: 60 * 1000, // 1 minutes
      max: 3, // Limit each IP to 3 requests per windowMs
      message: "too many requests",
    }));
};
© www.soinside.com 2019 - 2024. All rights reserved.