阅读数:

nodejs api限制请求次数

0

说明

最近实际项目中遇到了一个需求:现在api的单位时间内请求次数,如果熟悉微信接口的童鞋,会发现当你请求过于频繁的时候会有报错信息,类似
你太快之类的。说明下项目是基于express 实现的api平台。比如要求我们1hour内不能频繁连续请求1000次,该如何实现呢?

实现

经过苦苦寻找,终于找到了一款express的中间件 express-rate-limit,
阅读完api之后,发现很简单,但是原理是什么,好使么?让我们走起

  • install
1
npm install --save express-rate-limit
  • usage

before

1
2
3
app.use('/api', passport.authenticate('bearer', {session: false}), function (req, res, next) {
///
});

after

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var RateLimit = require('express-rate-limit');
var apiLimiter = new RateLimit({
windowMs: 60 * 60 * 1000, // 1 hour
max: 1000, // 1000 次
delayMs: 0, // disabled 延迟响应
handler: function (req, res) { // 响应格式
res.format({
json: function () {
res.status(429).json(util.error('Too many requests, please try again later.', 429, null));
},
html: function () {
res.status(429).end('Too many requests, please try again later.');
}
});
}
});
app.use('/api', apiLimiter);
app.use('/api', passport.authenticate('bearer', {session: false}), function (req, res, next) {
//
});

测试

  • 测试工具

goole浏览器的 Restlet client

  • 测试结果
    为了测试方便,我们就max设为5
    连续点击5次,正常返回如图:
    express-rate-limit

点击第6次,返回如图:
express-rate-limit

  • 测试结果符合要求

  • the end

最后

原理:基于memory,对访问的ip和资源进行key,value键值对存储,每windowMs清空一次
拓展:如果访问人数多,访问量太大,对内存也是个考验,甚至会拖慢服务,所以建议将源码改造,利用redis存储


^-^欢迎回复交流^-^


0
赏点咖啡钱^.^