Node.js是否一个一个处理客户端请求?

Node.js是否一个一个处理客户端请求? 我有一个项目,它使用Node.js作为服务器端代理。 根据我的理解,如果你使用一个callback来响应,Node.js应该没有任何延迟地响应新的请求,但实际上Node.js将不会响应新的请求,直到它完成了最后一次callback。 这是正确的行为还是有一些不正确的代码使用? 请帮助我。 非常感谢你。 以下是重新向后端服务发送请求的代码。

var request = require('request'); var http = require('http'); function apiService(){} apiService.prototype.get = function (context, payload, callback, url){ return this.requestAPI(context, payload, callback, url, "GET"); } apiService.prototype.post = function(context, payload, callback, url){ return this.requestAPI(context, payload, callback, url, "POST"); } apiService.prototype.del = function(context, payload, callback, url){ return this.requestAPI(context, payload, callback, url, "DELETE"); } apiService.prototype.requestAPI = function(context, payload, callback, url, method){ var config = context.config; var targetUrl = config.APIHost + (config.port == null ? "": (":" + config.port)) + "/" + config.baseDir + "/" + url; var requestObj = { url : targetUrl, json : true, pool: new http.Agent() } if (config.proxy != null){ requestObj.proxy = config.proxy; } switch (method){ case "POST": requestObj.body = payload; request.post(requestObj, function (err, resp, body){ if (err){ callback(err); return; } callback(null, body); }); break; case "GET": var queryString = ""; for (att in payload){ if (queryString != "") queryString += "&"; queryString += att.toString() + "=" + payload[att]; } if (queryString!="") requestObj.url += "?" + queryString; request.get(requestObj, function (err, resp, body){ if (err){ callback(err); return; } callback(null, body); }); break; case "DELETE": requestObj.body = payload; request.del(requestObj, function (err, resp, body){ if (err){ callback(err); return; } callback(null, body); }); break; } } 
 Current process client request1 -> Node client request2 -> Node Node server request1 ->backend Node (waiting for event loop) Node <- server response1 backend client <- response1 Node Node server request2 ->backend Node <- server response2 backend client <- response2 Node What I think it should be client request1 -> Node client request2 -> Node Node server request1 -> backend Node (won't waiting for event loop) Node server request2 -> backend Node <- server response2 backend client <-response2 Node Node <- server response1 backend client <-response1 Node 

更新:

  var params = { action : 'list' }; $http.post('../../service/buildingBlockService', params) .success(function(buildingBlocks){ callback(null, buildingBlocks); }).error(function(error){ callback(error); }) 

客户端请求来自Angular $http 。 在一页上,同时有几个请求。 根据我的Fiddler监视器,来自浏览器的请求没有等待发送,但服务器重新发送是一个接一个。

 app.post('/service/buildingBlockService', function (ctx, payload, req, res) { var service1 = require('./service/buildingBlockService'); var service = new service1(); service.service(ctx, payload, function(error, result){ res.send(200, result); }); }); 

更新:服务器请求的中间层。

 var service = require('./apiService'); function BuildingBlockService(){ } BuildingBlockService.prototype.init = function(){} BuildingBlockService.prototype.service = function(context, payload, callback) { var apiService = new service() var params = payload; switch (params.action){ case "list": default: apiService.get(context, null, callback, "BuildingBlocks"); break; } }; module.exports = BuildingBlockService; 

Node.js是否一个一个处理客户端请求?

是的,不,node.js运行你的JS单线程。 这意味着在任何时候只有一个执行的JS线程正在运行。 所以,如果你有这样的两个请求:

 // don't use this in real code, it's to simulate a point function spin(t) { var start = Date.now(); while (Date.now() < start + t) {} } app.post("/route1", req, res) { console.log("starting processing of /route1 request"); // simulate taking several seconds of pure CPU to make a response spin(2000); res.send("done 1"); console.log("finished processing of /route1 request"); } app.post("/route2", req, res) { console.log("starting processing of /route2 request"); // simulate taking several seconds of pure CPU to make a response spin(2000); res.send("done 2"); console.log("finished processing of /route2 request"); } 

并且一个/ route1请求之后紧跟着一个/ route2请求,那么node.js服务器将处理/ route1请求,并且不能做任何事情,直到完成这个请求为止,因为CPU一直保持忙。

所以,这会产生一个这样的日志:

 starting processing of /route1 request finished processing of /route1 request starting processing of /route2 request finished processing of /route2 request 

但是,纯粹因为CPU原因,要求花费很长时间的情况相对较less。 通常请求涉及某种types的I / O(文件读取,数据库查询,其他服务器联系等)。 如果使用asynchronousIO以不使用同步IO的方式以asynchronous方式完成I / O,则多个请求可以同时轻松地在运行,并且将同时处于运行状态,因为在node.js服务器正在等待为了完成I / O请求,可以自由地处理其他请求,并且可以处理其他请求。

所以,如果你有这个服务器代码:

 app.post("/route1", req, res) { console.log("starting processing of /route1 request"); // simulate taking several seconds of pure CPU to make a response request('http://www.google.com', function (error, response, body) { if (!error && response.statusCode == 200) { res.send("done 1"); console.log("finished processing of /route1 request"); } }); } app.post("/route2", req, res) { console.log("starting processing of /route2 request"); // simulate taking several seconds of pure CPU to make a response request('http://www.google.com', function (error, response, body) { if (!error && response.statusCode == 200) { res.send("done 2"); console.log("finished processing of /route2 request"); } }); } 

而一个/ route1请求之后紧跟着一个/ route2请求,那么你可能会看到这个日志(/ route1和/ route2响应完成的顺序不能保证 – 它们可以以任何顺序),但是两个响应都是并行处理:

 starting processing of /route1 request starting processing of /route2 request finished processing of /route1 request finished processing of /route2 request 

如果您的node.js代理服务器似乎展示了串行处理行为而不是并行处理行为,那么您可能会在实现代理时存在某种实施问题,因为它当然可以在多个请求飞行在同一时间。