当前位置: 首页 > 面试题库 >

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

朱自明
2023-03-14
问题内容

Node.js是否可以一一处理客户端请求?我有一个项目,正在使用Node.js作为服务器端代理。根据我的理解,如果您使用回调进行响应,那么Node.js应该立即响应新请求,但是实际上Node.js直到完成上一个回调后才会响应新请求。这是正确的操作还是代码使用有误?请帮我。非常感谢你。以下是用于将请求重新发送到后端服务的代码。

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原因,请求花费很长时间是相对罕见的。请求通常涉及某种I / O(要读取的文件,数据库查询,要联系的其他服务器等)。如果该I /
O是使用异步IO而不是同步IO以异步方式完成的,则多个请求可以轻松地同时进行,并且可以同时进行,因为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代理服务器似乎表现出串行处理行为而不是并行处理行为,则可能是在实现代理方面存在某种实现问题,因为它肯定能够在其中包含多个请求同时飞行。



 类似资料:
  • 我正在用java开发一个ServerSocket,我想知道,在客户端连接时,是否有可能将客户端/套接字发送到另一个ServerSocket。例如,一个客户端连接到123.41.67.817(只是一个随机IP),在连接时,客户端被直接发送到例如124.51.85.147(另一个随机IP),当然还有一个端口。所以一个会发生什么的小地图。 服务器套接字(侦听连接)< br> 客户端- 这有可能吗?抱歉问

  • client list 列出所有连接 client kill 杀死某个连接, 例如CLIENT KILL 127.0.0.1:43501 client getname # 获取连接的名称 默认nil client setname "名称" 设置连接名称,便于调试

  • ServerSocket是来自Java.NET API的ServerSocket normal Socket是来自Java.NET API的Socket 是的,这里的ServerSocket是指建立连接后从ServerSocket.Accept返回的套接字

  • 我正在构建一个游戏,其中两个用户与时钟竞争。每个玩家有60秒的时间来回答尽可能多的问题。 我有两种可能的计时方法: 使用套接字,每秒将剩余时间从服务器发送到客户端。io,浪费服务器资源 我的问题是:客户端倒计时在两个客户端之间是否合理一致? 如果在客户端实现,它将使用JavaScript中的setInterval()。

  • 问题内容: 我想在两个或更多不同的node.js应用程序服务器之间启用基于套接字的p2p通信。我正在使用socket.io处理给定服务器与其服务的Web应用程序之间的所有此类通信- 但我正在寻找的是一种服务器与服务器之间进行通信的方法。 我最初以为它像这样简单: 但是,事实证明,服务器端socket.io实现没有提供“连接”方法,仅提供了侦听方法。 为什么是这样?为什么不能将节点应用程序服务器视为

  • 问题内容: 有什么方法可以在node.js的客户端和服务器之间共享数据(包括对象)?我曾经依赖于为此目的而设计的模块now.js,但是该项目已经停产了,我正在寻找替代品。现在now.js被放弃了,还有没有其他方法可以在客户端和服务器之间无缝同步变量? 问题答案: 在now.js之后,两个最接近的竞争者是shareJS和dnode: http://sharejs.org/ https://githu