2014-07-02 26 views
0

我有一个快速的Node.js应用在多个用户发出请求到服务器,以获得积分,改变他们的电子邮件地址,与其他用户互动等Express.js请求隔离

我的服务器代码使用相当几个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

你有没有考虑过实施数据库事务? – Kamrul

+0

你能发布有问题的代码吗?你问的是可能的,但它是否会发生在你身上将取决于变量作用域以及代码的结构等。 – dc5

回答

0

由于Node是单线程的,所以一次只能运行一个执行线程。任何I/O,或在这种情况下,setTimeout都会将该代码的处理推送到堆栈上,以便Node可以继续处理其他事情(通常来自此事件循环)。 setTimeout设置一个定时器,一旦时间到期,它将把函数放在堆栈上运行。所以如果有人在该定时器到期之前提出请求,那么他们的请求将首先被处理。

所以是的,这两个请求的处理将会交织在一起。我建议你以某种方式在你的代码库(或者你的数据库)中注册第一个请求是针对该电子邮件地址的,因此下一个请求不会注册相同的内容。

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