NodeJS如何处理来自不同用户/浏览器的多个GET请求?

时间:2019-06-25 03:00:56

标签: node.js get eventemitter

我想知道NodeJS如何处理来自不同用户/浏览器的多个GET请求,这些请求发出事件以返回结果?我想当用户每次执行GET请求时,就好像为该用户启动了新会话一样。

例如,如果我有此GET请求

var tester = require('./tester-class');

app.get('/triggerEv', async function(req, res, next) {
    // Start the data processing
    tester.startProcessing('some-data');

    // tester has event emitters that are triggered when processing is complete (success or fail)
    tester.on('success', function(data) {
        return res.send('success');
    }
    tester.on('fail', function(data) {
        return res.send('fail');
    }
}

我的想法是,如果我打开浏览器并通过传递some-data来运行此GET请求并开始处理。然后打开另一个浏览器以使用不同的数据执行此GET请求(以模拟多个用户同时访问它),它将覆盖之前的startProcessing函数,并使用新数据再次运行它。

因此,如果多个用户同时执行此GET请求,它将为每个用户分别处理该请求,就好像它是不同的,并且独立的会话然后在每个用户的会话都有响应时返回吗?还是像我上面提到的那样做(这种情况下,我将不得不以某种方式为触发此GET请求的每个用户管理不同的会话)?

我希望这样做,以便每个执行此GET请求的用户不会干扰也同时执行此GET请求的其他用户,并根据每个用户发送给自己的数据为每个用户返回正确的响应startProcessing函数。

谢谢,我希望我有道理。如果没有,将会澄清。

1 个答案:

答案 0 :(得分:1)

如果您要在不同的请求之间共享全局tester对象,则第二个请求将干扰第一个请求。由于所有传入请求都在node.js中使用相同的全局环境,因此通常的模型是,任何可能在一段时间内处于“运行中”的请求都需要创建自己的资源并将其保留给自己。然后,如果在第一个请求仍在等待完成的同时又有其他请求到达,那么它还将创建自己的资源,并且这两个请求不会冲突。

服务器环境在您使用术语时没有“会话”的概念。除了为每个传入请求创建的requestresponse对象之外,每个请求都没有单独的服务器会话或服务器状态。这不像PHP-每个请求都没有一个全新的解释器状态。

  

我希望这样做,以便每个执行此GET请求的用户不会干扰也同时执行此GET请求的其他用户,并根据每个用户发送给自己的数据为每个用户返回正确的响应startProcessing函数。

然后,不要在请求之间共享任何资源,也不要使用具有全局状态的对象。我不知道您的tester是什么,但是将多个请求彼此分开的一种方法是为每个请求仅创建一个新的tester对象,以便他们可以充分利用它没有任何冲突。