express-rate-limit中间件每隔一定时间会清空统计的各个IP访问次数
发布于 7 年前 作者 lovegnep 4527 次浏览 来自 问答

看了下源码,通过设置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

回到顶部