express-rate-limit中间件每隔一定时间会清空统计的各个IP访问次数
看了下源码,通过设置var interval = setInterval(this.resetAll, windowMs)来进行每隔windowMs豪秒清空统计次数。 但随后又调用了interval.unref()来暂停该定时器。请问为什么要暂停该时时器呢?
function MemoryStore(windowMs) {
var hits = {};
this.incr = function(key, cb) {
if (hits[key]) {
hits[key]++;
} else {
hits[key] = 1;
}
cb(null, hits[key]);
};
this.resetAll = function() {
hits = {};
};
// export an API to allow hits from one or all IPs to be reset
this.resetKey = function(key) {
delete hits[key];
};
// simply reset ALL hits every windowMs
var interval = setInterval(this.resetAll, windowMs);
if (interval.unref) {
interval.unref();
}
}
module.exports = MemoryStore;
6 回复
没有人了解这个中间件吗
首先我确认的一点就是 unref 绝对不是清除定时器。
你可以搜一下论坛里面的关于 unref 的内容,我看了下,也自己测试了一下,注释掉 unref 会让进程运行不退出。 也就是说 unref 可以让定时器跟随最后一个非 unref 的任务退出。
自己试一下不就知道了。
@MiYogurt 我试过了。unref会暂停计时器。 调试的时候发现明明已经调用unref暂停该计时器了,但该中间件还是会每隔一定时间执行this.resetAll
看来你一点都不灵性。 我跟你说的是进程,你跟我说定时器。我跟你说现实,你跟我谈理想,我跟你说朴实无华面包,你跟我讲纯洁无暇爱情。
@MiYogurt 谢谢,在社区搜索了unref的讨论,还真有,现在有点懂了。 参考了下面这篇帖子 https://cnodejs.org/topic/570924d294b38dcb3c09a7a0#59ddf8b361932717683d2249