Http Request无法在Nodejs服务器中立即发送响应

时间:2017-03-12 03:38:08

标签: javascript node.js mongodb rest

我将jSON请求逐个发送到nodejs服务器。在第6次请求之后,服务器无法立即回复客户端然后需要一段时间(15秒或更多一点并发回给我回答200 ok)它发生写入json值到MongoDB中,时间是重要的选项关于REST调用我。在这种情况下如何找到错误? (哪个工具或脚本代码可以帮助我?)我的服务器端代码就像那样

var controlPathDatabaseSave = "/save";
app.use('/', function(req, res) {
console.log("req body app use", req.body);
var str= req.path;

if(str.localeCompare(controlPathDatabaseSave) == 0)
{
    console.log("controlPathDatabaseSave");
    mongoDbHandleSave(req.body);
    res.setHeader('Content-Type', 'application/json');
    res.write('Message taken: \n');
    res.write('Everything all right with database saving');
    res.send("OK");
    console.log("response body", res.body);
}

});

我的客户端代码如下:

function saveDatabaseData()
{
    console.log("saveDatabaseData");
        var oReq = new XMLHttpRequest();
        oReq.open("POST", "http://192.168.80.143:2800/save", true);
        oReq.setRequestHeader("Content-type", "application/json;charset=UTF-8");
        oReq.onreadystatechange = function() {//Call a function when the state changes.
            if(oReq.readyState == 4 && oReq.status == 200) {
                console.log("http responseText", oReq.responseText);
            }
        }
        oReq.send(JSON.stringify({links: links, nodes: nodes}));
}

- Mongodb保存代码

function mongoDbHandleSave(reqParam){
//Connect to the db
    MongoClient.connect(MongoDBURL, function(err, db)
    {
        if(!err)
        {
            console.log("We are connected in accordance with saving");
        } else
        {
            return console.dir(err);
        }

    /*
        db.createCollection('user', {strict:true},  function(err, collection) {
            if(err)
                return console.dir(err);
        });
    */
        var collection = db.collection('user');
        //when saving into database only use req.body. Skip JSON.stringify() function
        var doc = reqParam;
        collection.update(doc, doc, {upsert:true});
    });

}

您可以在Google Chrome开发者编辑器中查看我的REST调用。 (前六个呼叫有200个确定。最后一个呼叫处于暂挂状态)

enter image description here

- 客户输出

enter image description here

- 服务器输出

enter image description here

提前致谢,

1 个答案:

答案 0 :(得分:2)

由于看起来这些是来自浏览器的Ajax请求,因此每个浏览器对同一主机允许的同时连接数有限制。浏览器随着时间的推移而变化,但可能在4-6范围内。因此,如果您尝试同时对同一主机运行6个ajax调用,那么您可能会遇到该限制。浏览器所做的是在发送最新的内容之前暂停,直到第一个完成(从而避免一次发送太多)。

这里的一般想法是保护服务器免受单个客户端的过多打击,从而允许更公平地在多个客户端之间共享负载。当然,如果您的服务器没有其它任何事情可做,它实际上并不需要保护几个连接,但这不是一个交互式系统,它只是硬连接到一个限制。

如果正在处理任何其他请求(将图像或脚本或CSS样式表加载到同一个源),那么这些请求也会计入限制。

如果您在Chrome中运行此功能并打开调试器的网络选项卡,您实际上可以确切地在时间线上看到发送给定请求的时间以及收到响应的时间。这应该立即向您显示后来的请求是否在浏览器或服务器上被阻止。

以下是关于该主题的文章:Maximum concurrent connections to the same domain for browsers

另外,请记住,根据您的请求在服务器上执行的操作以及服务器的结构,可能会有一次可以有效处理的最大数量的服务器请求。例如,如果你有一个为四个CPU中的每一个配置了一个线程的阻塞线程服务器,那么一旦服务器一次有四个请求,它可能必须排队第五个请求,直到第一个请求完成,导致它被推迟比其他人更多。