节点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()
,是否可能出现竞争条件?
如果是这样,有一种避免这种情况的“最佳方式”吗?
答案 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
将被设置为新值。