【问题标题】:Be secured from perform one action twice防止两次执行一个动作
【发布时间】:2016-08-07 18:51:40
【问题描述】:

我在 Node.js 上有应用程序,使用 Express 作为 API 路由,使用 MongoDB 作为 DB。 我有一个抽奖。用户只能参加一次抽奖。 我目前正在使用内存中的数组参与,但如果您同时向 API 发出两个请求,用户将参与两次抽奖。 如何禁止多次参加抽奖活动?

【问题讨论】:

    标签: javascript node.js mongodb api express


    【解决方案1】:

    您需要构建工作流程以支持幂等操作。也就是说,两次执行相同的操作不会改变结果。

    例如,增加一个变量是不是幂等的,因为两次调用 increment 函数会导致变量增加两次(例如调用 x++ 两次将导致在 x 中增加 2) .我认为这是您当前设计的精髓,其中您提到:“如果您同时向 API 发出两个请求,则用户将参加两次抽奖”。

    幂等操作的一个例子是将一个变量设置为一个值。例如,多次调用var x = 1 只会导致值1 被分配给x。无论您拨打该线路多少次,x 始终是1

    一些可帮助您入门的资源:

    【讨论】:

      【解决方案2】:

      您应该将数组存储在 mondodb 中,如果节点重新启动,您不想丢失此列表。

      关于“加入两次”问题,只需限制向您的 API 发出请求的客户端函数,以便在您的限制函数传递的时间内只能调用一次。

      节流功能示例:

      function throttle (callback, limit) {
         var wait = false;
         return function () {
            if (!wait) {
               callback.apply(this, arguments);
               wait = true;
               setTimeout(function () {
                  wait = false;
               }, limit);
            }
         }
      }
      

      现在是你的请求函数:

      var throttleApiFunc = throttle(apiFunc, 5000);
      
      // this can only trigger one time each 5 seconds
      throttleApiFunc();
      

      【讨论】:

      • 如何避免在处理 SAME 用户请求时向一个 API 路由发出第二个用户请求?等待一段时间是不好的,因为我们有很多用户。
      • 你在客户端油门,所以这对用户来说不是问题,他们不会等待,油门在触发之前不会等待(去抖动),它会触发然后你不能按你说的时间再开火。由于您限制客户端,因此它们不会同时对同一用户处理两个请求,这正是您想要的。
      • 是的,但有些用户滥用从 Chrome 控制台发送请求 ($.post('/api...'))
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-29
      相关资源
      最近更新 更多