Express.js请求隔离

时间:2014-07-02 01:13:31

标签: javascript node.js express

我有一个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处理的内容。

我已经对此进行了测试,但事情似乎有效,但我对角落案件感到担心。

2 个答案:

答案 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在其计时器完成后将调用的函数,并且由于所有先前的请求都按顺序排队执行,因此它们将按顺序触发。我相信您的代码在确定单个请求的行为方面是无风险的。只要先前请求处理的数据库操作的结果不会影响将来的请求,您就可以了。