有人让我意识到了我正在处理的应用程序中的一些缺陷(大多数情况是在前端的JavaScript中),这使得立即单击大量按钮并发送大量事务性对象成为可能。电子邮件。这显然不好。

我认为在ExpressJS中处理此问题的一种方法是使用app.all()计数在特定时间范围内发生的请求数。我将其存储在带有时间戳的 session 元数据中,并且如果在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);
    });
};

09-17 12:05