有人让我意识到我正在开发的应用程序中存在一些缺陷(主要是在前端的 JavaScript 中),这使得有可能同时单击大量按钮并发送大量事务电子邮件。这显然不好。
我认为在 ExpressJS 中处理这个问题的一种方法是使用app.all()
计算在特定时间范围内发生的请求数量。我会将其存储在带有时间戳的会话元数据中,如果在 Y 时间内发生超过 X 个请求,我会将它们切断一段时间,直到限制到期。
有没有人以前做过这个或有任何提示/提示来帮助我?最好是易于放入和取出我的应用程序的东西。谢谢!
你可以使用Collate
网页中的对象。
function Collate(timeout) {
this.timeout = timeout || 1000;
}
Collate.prototype = {
time: 0,
idle: function() {
var t = new Date().getTime();
return (t - this.time > this.timeout && (this.time = t));
},
prefer: function(func) {
this.func = func;
clearTimeout(this.timer);
this.timer = setTimeout(func, this.timeout);
}
};
如果您希望某个函数运行一次并且在接下来的 1 秒内不再运行。
就像如果你想阻止用户多次提交表单,你可以这样做:
var timer = new Collate(3000); //3 seconds
button1.onclick = function() {
if(timer.idle()) {
button1.form.submit();
} else alert("Don't click too quickly!");
}
//or on the form tag
<script>var submitTimer = new Collate(3000);</script>
<form action="post" onsubmit="return submitTimer.idle();">
如果您期望一个事件多次触发并且只想对其最后一次触发做出反应。
就像如果您想在用户完成输入后进行搜索,您可以这样做:
var timer = new Collate(700); //0.7 seconds
textfield1.onkeyup = function() {
timer.prefer(function() {
autocomplete.search(textfield1.value);
});
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)