如何在Strapi v4中为contact-uses接口集成koa2-ratelimit做频率限制
解决Strapi v4中POST /api/contact-uses接口的限流问题(每分钟1次)
步骤1:安装依赖
首先安装koa2-ratelimit:
npm install koa2-ratelimit --save
步骤2:创建自定义限流中间件
在Strapi项目的src/middlewares目录下新建rate-limit文件夹,里面创建index.js文件,写入以下代码:
const rateLimit = require('koa2-ratelimit').RateLimit; module.exports = (strapi) => { return { initialize() { // 配置限流规则:每分钟最多1次请求 const contactLimiter = rateLimit({ interval: 60 * 1000, // 1分钟(毫秒单位) max: 1, // 允许的最大请求次数 prefixKey: 'contact-form', // 自定义键前缀,区分不同接口的限流统计 message: '请求过于频繁,请1分钟后再试', headers: true, // 返回限流相关的响应头(剩余次数、重置时间等) }); // 给POST /api/contact-uses接口绑定限流规则 strapi.server.router.post('/api/contact-uses', contactLimiter); }, }; };
步骤3:注册中间件
打开项目根目录的config/middlewares.js,将自定义的rate-limit中间件添加到数组中(建议放在strapi::bodyParser之后、strapi::router之前,确保请求解析完成后再做限流判断):
module.exports = [ 'strapi::errors', 'strapi::security', 'strapi::cors', 'strapi::poweredBy', 'strapi::logger', 'strapi::query', 'strapi::bodyParser', 'rate-limit', // 这里添加自定义限流中间件 'strapi::session', 'strapi::favicon', 'strapi::public', ];
步骤4:测试验证
重启Strapi服务,然后多次发送POST请求到/api/contact-uses:第一次请求会正常响应,之后1分钟内的重复请求会返回429 Too Many Requests状态码,并显示你设置的提示信息。
补充说明
- 上述方案使用内存存储限流数据,Strapi重启后限流计数会重置;如果是生产环境需要持久化统计,可以配置Redis存储,具体修改
rateLimit配置中的store项即可(参考koa2-ratelimit官方参数说明)。 - 若需给多个接口限流,可在中间件中添加更多
strapi.server.router.xxx调用,或通过路由匹配规则批量处理。
内容的提问来源于stack exchange,提问作者Subin Kurian
相关产品推荐
相关产品推荐

