【发布时间】:2016-08-07 18:51:40
【问题描述】:
我在 Node.js 上有应用程序,使用 Express 作为 API 路由,使用 MongoDB 作为 DB。 我有一个抽奖。用户只能参加一次抽奖。 我目前正在使用内存中的数组参与,但如果您同时向 API 发出两个请求,用户将参与两次抽奖。 如何禁止多次参加抽奖活动?
【问题讨论】:
标签: javascript node.js mongodb api express
我在 Node.js 上有应用程序,使用 Express 作为 API 路由,使用 MongoDB 作为 DB。 我有一个抽奖。用户只能参加一次抽奖。 我目前正在使用内存中的数组参与,但如果您同时向 API 发出两个请求,用户将参与两次抽奖。 如何禁止多次参加抽奖活动?
【问题讨论】:
标签: javascript node.js mongodb api express
您需要构建工作流程以支持幂等操作。也就是说,两次执行相同的操作不会改变结果。
例如,增加一个变量是不是幂等的,因为两次调用 increment 函数会导致变量增加两次(例如调用 x++ 两次将导致在 x 中增加 2) .我认为这是您当前设计的精髓,其中您提到:“如果您同时向 API 发出两个请求,则用户将参加两次抽奖”。
幂等操作的一个例子是将一个变量设置为一个值。例如,多次调用var x = 1 只会导致值1 被分配给x。无论您拨打该线路多少次,x 始终是1。
一些可帮助您入门的资源:
【讨论】:
您应该将数组存储在 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();
【讨论】: