Node.js Express.js是否可以在post上设置竞速条件
我确定这里没有问题 我在一个简单的express JS应用程序中有以下代码Node.js Express.js是否可以在post上设置竞速条件,node.js,express,race-condition,Node.js,Express,Race Condition,我确定这里没有问题 我在一个简单的express 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
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});
});
我仍然不了解节点请求的工作流
如果同时处理对/match
的两个post请求,使得两个post都试图调用randomPin.generate()
,是否可能出现竞态条件
如果是这样,是否有避免这种情况的“最佳方法”?如果有两个POST
/match
请求,则第二个请求将等待第一个请求完成。但是,如果您的post处理程序更新了任何全局变量或对象(例如缓存),则该更改将对其他请求可见
在您的情况下,randomPin.generate()
将不会有竞争条件问题,因为Node.js中不存在同时执行的情况
您可以在此处阅读更多内容:如果我理解正确,这里的一些信息可能会帮助您了解您想要了解的内容:
节点是单线程的。这意味着传入的每个请求都将被串行处理。假设用户1请求
/match
并发送pin=pin
,而用户2请求/match
与pin=pin
以完全相同的毫秒。当您的节点服务器收到这两个请求时,它将为每个请求触发一个事件但它不会并行触发这些事件,因为节点是单线程的。首先触发一个事件,然后触发下一个事件。要触发的第一个事件将完成其回调,并将运行randomPin.generate()
。一旦完成,下一个事件将运行其回调,并且currentPin
将被设置为新值。因此,如果randomPin.generate()启动并执行异步操作以获取其值,那么对/match的第二次调用可能会在返回之前进行处理?如果randomPin.generate()
触发异步代码,然后,当前代码将中断,因为它需要同步返回值。因此,您必须创建一个只允许下一次调用完成一次的队列randomPin.generate()
完成了它的工作。@Jason,这是一个很好的观点。然而,由于问题中以同步方式使用了randomPin.generate()
,我假设它是这样工作的,类似于crypto.randomBytes()
(它也可以接受回调函数)。@Tom我做了同样的假设,我只是想为Paul的后续问题提供更多的上下文。谢谢。。。这对我来说现在更清楚了。当我打开我的话题时,我仍然不知道引擎盖下发生了什么:)嗨@Jason,你能检查一下我的这个问题吗,它和这个问题很相似,但我还没有得到确切的答案。