koa-ratelimit使用注意了

如果你的后台使用koa,并使用了koa-ratelimit
那么如果客户端使用多级代理网络,那么你将喜提BUG一枚!

AssertionError [ERR_ASSERTION]: .id required
at new Limiter (\node_modules\koa-ratelimit\limiter\memory.js:36:5)
at ratelimit (\node_modules\koa-ratelimit\index.js:71:17)
at async serve (\node_modules\_koa-static@5.0.0@koa-static\index.js:53:9)


## 服务全给停了,哈哈哈刺激不?


以下是官方例子```


const Koa = require('koa');
const ratelimit = require('koa-ratelimit');
const Redis = require('ioredis');
const app = new Koa();

// apply rate limit
app.use(ratelimit({
  driver: 'redis',
  db: new Redis(),
  duration: 60000,
  errorMessage: 'Sometimes You Just Have to Slow Down.',
  id: (ctx) => ctx.ip,
  headers: {
    remaining: 'Rate-Limit-Remaining',
    reset: 'Rate-Limit-Reset',
    total: 'Rate-Limit-Total'
  },
  max: 100,
  disableHeader: false,
  whitelist: (ctx) => {
    // some logic that returns a boolean
  },
  blacklist: (ctx) => {
    // some logic that returns a boolean
  }
}));

// response middleware
app.use(async (ctx) => {
  ctx.body = 'Stuff!';
});

// run server
app.listen(
  3000,
  () => console.log('listening on port 3000')
);


```
这里很明显有个id

  id: (ctx) => ctx.ip,

别犹豫改吧!

id: (ctx) => {
     if (ctx.ip) {
        return ctx.ip
      } else {
        let ip = ctx.request.ip
        if (ctx.request.headers["x-real-ip"]) {
          ip = ctx.request.headers["x-real-ip"]
        } else if (ctx.request.headers["x-forwarded-for"]) {
          ip = ctx.request.headers["x-forwarded-for"].split(",")[0].trim()
        } else if (!ip) {
          ip = "::ffff:127.0.0.1"
        }
        console.log("多级代理IP", ip)
        return ip
      }
    },

如果你有更好的办法欢迎评论区交流!
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值