我有一个Node.js Express应用程序,其中多个用户向服务器发出请求以获得积分,更改其电子邮件地址,与其他用户交互等等。
我的服务器代码使用了不少的setTimeouts,我想知道是否有可能让不同的用户请求相互损坏。
编辑: 这是一个更好的例子:
我有这段代码:
app.post('/webhooks/email', function (req, res, next) {
var storeRequestInDataBase = function(req, res, next) {Writes Request Data To Database};
setTimeout(storeRequestInDataBase, 10000, req, res, next);
res.send(200, 'Message Received');
});
现在,如果我从不同用户每秒收到10个请求,则来自其他用户的请求将在第一个用户的setTimeout之前出现。所以,我想知道是否存在范围风险,其中最后一个请求是第一个用户的setTimeout处理的内容。
我已经对此进行了测试,但事情似乎有效,但我对角落案件感到担心。
答案 0 :(得分:0)
由于Node是单线程的,因此一次只能运行一个执行线程。任何I / O,或者在这种情况下,是setTimeout,都会将该代码的处理推送到堆栈,以便Node可以继续处理其他事情(通常来自此事件循环)。 setTimeout设置一个计时器,一旦时间到期,它将把要运行的函数放在堆栈上。因此,如果有人在该计时器到期之前提出请求,那么他们的请求将首先被处理。
所以是的,两个请求的处理将交织在一起。我建议你以某种方式在你的代码库(或者你的数据库)中注册第一个请求是针对该电子邮件地址的,这样下一个请求就不会尝试注册相同的内容。
答案 1 :(得分:0)
我很开心,但最近我遇到了与原始问题中提出的问题类似的情况,并且觉得提供的答案需要一些澄清。
重新访问代码示例:
app.post('/webhooks/email', function (req, res, next) {
var storeRequestInDataBase = function(req, res, next) {Writes Request Data To Database};
setTimeout(storeRequestInDataBase, 10000, req, res, next);
res.send(200, 'Message Received');
});
由于storeRequestInDataBase
变量在每次向/webhooks/email
发出请求时都重新定义为新函数,因此新定义的函数将被处理。您没有更改setTimeout在其计时器完成后将调用的函数,并且由于所有先前的请求都按顺序排队执行,因此它们将按顺序触发。我相信您的代码在确定单个请求的行为方面是无风险的。只要先前请求处理的数据库操作的结果不会影响将来的请求,您就可以了。