保证两次执行一次操作

时间:2016-08-07 18:51:41

标签: javascript node.js mongodb api express

我在Node.js上有应用程序,使用Express作为API路由,MongoDB作为DB。 我有一个抽奖活动。用户必须只加入抽奖活动一次。 我目前正在使用内存中的数组参与,但是如果你同时向API发出两个请求,那么用户将在抽奖中加入两次。 我怎么能不允许多次加入抽奖活动?

2 个答案:

答案 0 :(得分:0)

您应该将数组存储在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();

答案 1 :(得分:0)

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

例如,递增变量是而不是幂等,因为调用增量函数两次导致变量增加两次(例如,调用x++两次将导致向{{{}添加2 1}})。我认为这是您当前设计的精髓所在,您提到:"如果您同时向API提出两个请求,则用户将在抽奖中加入两次"。

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

帮助您入门的一些资源: