Javascript Node.js如何同时处理多个请求

Javascript Node.js如何同时处理多个请求,javascript,node.js,Javascript,Node.js,我有一个Node.js应用程序,注意到当我同时向我的Node Api发出两个请求时,它们似乎在排队。也就是说,第二个请求的时间是第一个请求的时间加上第二个请求的时间(如果我只是自己触发了该请求) 所以我做了一个简单的测试: app.get('/api/testpromise', function(req, res) { sess = req.session; var controller = new Controller(req, res, sess); contr

我有一个Node.js应用程序,注意到当我同时向我的Node Api发出两个请求时,它们似乎在排队。也就是说,第二个请求的时间是第一个请求的时间加上第二个请求的时间(如果我只是自己触发了该请求)

所以我做了一个简单的测试:

app.get('/api/testpromise', function(req, res) {

    sess = req.session;

    var controller = new Controller(req, res, sess);

    controller.testPromise()
    .then(function(){
        controller.testPromise()
        .then(function(){
             res.status(200);
             res.json({});
        });
    })
})
testPromise()方法只执行一个循环:

Controller.prototype.testPromise = function(callback){

    return new Promise(function(resolve, reject) {

        var count = 0;
        for (i = 0; i < 500000000; i++) {
            count++;
        }

      if(count) {
        resolve(count);
      } else {
        reject(count);
      }
    });

}
Controller.prototype.testPromise=函数(回调){
返回新承诺(功能(解决、拒绝){
var计数=0;
对于(i=0;i<500000000;i++){
计数++;
}
如果(计数){
解决(计数);
}否则{
拒绝(计数);
}
});
}
我从前端同时向“testpromise”发出两个请求,第一个请求大约需要5秒才能完成,第二个请求大约需要10秒。所以第二个似乎排在第一个后面


我想从我读到的关于Node的内容来看,我不会看到这样的行为?据说Node非常擅长处理大量并发请求并将它们传递出去。那么这实际上是如何工作的呢?

您的测试使用的是阻塞同步代码。(i=0;i<500000000;i++)的for循环
将一直运行到它完成,因此中的第一个请求在它完成之前不会释放对事件循环的控制。这就像“忙碌的等待”

对你来说,一个更好的测试就是推迟

return new Promise(function(resolve, reject) {
    setTimeout( function () {
      resolve(5000) 
    }, 5000 ) // run the given function in 5000ms
});

这样,事件循环将在第一个请求等待时启动第二个请求。因此,如果您同时请求它们,它们将同时完成。

好吧,这归结为:JS是单线程的,尽管您使用承诺,但您的循环会阻止此线程中其他代码的执行。看看这个:谢谢。实际上,我的API端点向MongoDb发出查询,它们正在排队……您可以发布实际代码以获得更多帮助,但对Mongo DB的调用应该像对节点的
setTimeout()
调用一样,因为它将在Mongo获取数据时开始处理下一个请求。