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

标签 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 ok。最后一个处于挂起状态)

enter image description here

--客户端输出

enter image description here

--服务器输出

enter image description here

提前致谢

最佳答案

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

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

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

如果您在 Chrome 中运行它并打开调试器的网络选项卡,您实际上可以在时间轴上准确地看到给定请求的发送时间和响应接收时间。这应该会立即向您显示后面的请求是在浏览器还是在服务器上被阻止。

这是一篇关于该主题的文章:Maximum concurrent connections to the same domain for browsers .

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

关于javascript - Http Request 无法在 Nodejs 服务器中立即发送响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42743463/

相关文章:

javascript - 如何让 bower 和 grunt 添加 angular-bootstrap ui 依赖项?

javascript - AJAX JQUERY 变量

javascript - Javascript 中的变量 "Variables"- 未定义

javascript - 如何从javascript中的其他数组向数组中对象内的键添加值

node.js - 如何重新翻译其他网站的图像(隐藏源 URL)

node.js - 使用 Express API 和 ytdl 下载音频文件

mongodb - 防止 Lithium/mongoDB 中的表单操作

mongodb - RoboMongo 在集合中找到某些文档

mongodb - 从mongodb中的三个集合中获取结果

javascript - 带有 JQuery 数据表的 Core 2 MVC