【问题标题】:Http Request can't send a response immediately in Nodejs serverHttp Request 无法在 Nodejs 服务器中立即发送响应
【发布时间】:2017-03-12 03:38:07
【问题描述】:

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

--客户端输出

--服务器输出

提前致谢,

【问题讨论】:

  • 你能粘贴服务器输出和客户端javascript控制台输出吗?相对而言,您的代码可以清理很多,这可能有助于发现错误的来源... 编辑: 还请包含mongoDbHandleSave 函数。如果其中包括数据库凭据,请将凭据替换为变量。
  • @FissureKing 我根据你的意愿更新了问题。
  • 我猜你的ServerResponses 没有被终止。撇开你设置一个值为application/jsonContent-Type 标头然后发送纯文本这一事实不谈,我想说尝试在你的路由中注释掉mongoDbHandleSave 之后的所有内容并发送一个简化的响应以进行测试:res.status(200).end() .

标签: javascript node.js mongodb rest


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • @zoint - 这回答了你的问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
相关资源
最近更新 更多