Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Express.js是否可以在post上设置竞速条件_Node.js_Express_Race Condition - Fatal编程技术网

Node.js Express.js是否可以在post上设置竞速条件

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

我确定这里没有问题

我在一个简单的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 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,你能检查一下我的这个问题吗,它和这个问题很相似,但我还没有得到确切的答案。