Express.js可以在帖子上有竞争条件

时间:2014-02-04 20:56:42

标签: node.js express race-condition

节点noob问题我确定。

我在简单的快速JS应用程序中有以下代码

var randomPin = require('./api/randomPin');
var currentPin = "pin";
app.post('/match', function(req, res) { 
    if (req.body.pin && req.body.pin == currentPin) {
            //it should only be possible for one person to get here
            //and receive this hurrah
        currentPin = randomPin.generate();
        res.send({hurrah:true});
    }

    res.send({hurrah:false});
});

我仍然没有理解Node请求的工作流程......

如果同时处理向/match发送的两个帖子请求,以便两个帖子都试图呼叫randomPin.generate(),是否可能出现竞争条件?

如果是这样,有一种避免这种情况的“最佳方式”吗?

2 个答案:

答案 0 :(得分:7)

如果有两个POST /match请求,则第二个请求将等待第一个请求完成。但是,如果您的帖子处理程序更新任何全局变量或对象(例如缓存),则该更改将对其他请求可见。

在您的情况下,randomPin.generate()不会出现竞争条件问题,因为在Node.js中没有同时执行。

您可以在此处详细了解:Single threaded and Event Loop in Node.js

答案 1 :(得分:3)

如果我理解正确,这里有一些信息可以帮助你找出你想要弄清楚的内容:

Node是单线程的。这意味着每个进入的请求都将被串行处理。假设用户1请求/match并发送pin=pin,用户2请求/match pin=pin完全相同的毫秒。当您的节点服务器收到这两个请求时,它将为每个... 触发一个事件,但它不会并行触发这些事件,因为节点是单线程的。 一个事件将首先触发,然后是下一个事件。第一个触发事件将完成其回调,并将运行randomPin.generate()。一旦完成,下一个事件将运行其回调,currentPin将被设置为新值。