Node JS花费很长时间发送初始数据

时间:2013-05-16 07:06:08

标签: javascript node.js optimization

我正面临NodeJS的问题。在我得到任何更新之前,最初需要很长时间大约4-5秒。 Node JS Server可公开访问,并且不通过任何代理或任何东西进行修补。但是一旦建立了初始连接 - 更新是即时的。

我使用Chrome中的网络工具深入挖掘 - 它说它正在等待数据。见附图

我也粘贴了app.js(节点应用程序)的代码供您参考。

var http = require('http'),
    url = require('url'),
    fs = require('fs'),
    amqp = require('amqp'),
    sys = require(process.binding('natives').util ? 'util' : 'sys');
var exchangeName = 'conferenceTest';
send404 = function (res) {
  res.writeHead(404);
  res.write('404');
  res.end();
};
server = http.createServer(function (req, res) {
  var path = url.parse(req.url).pathname;
  switch (path) {
  case '/':
    fs.readFile(__dirname + "/index.html", function (err, data) {
      if (err) {
        return send404(res);
      } else {
        res.writeHead(200, {
          'Content-Type': 'application/zip',
          'Connection': 'close',
          'content-encoding': 'gzip'
        });
        res.write(data, 'utf8');
        res.end();
      }
    });
    break;
  }
});
// listen to the http server for socket connections
var io = require('socket.io').listen(server);
var connection = amqp.createConnection({
  host: 'localhost'
});
connection.on('ready', function () {
  var exchange = connection.exchange(exchangeName, { // create exchange
    type: 'direct',
    durable: true
  });
  io.sockets.on('connection', function (client) {
    console.log("client connected");
    client.on('changeview', function (data) {
      var queue = connection.queue(data.queueName, { //create queue
        durable: true,
        autoDelete: false
      });
      var plaintext = "Put any kind of meat on a stick and roast it over a flame and it immediately becomes food fit for gods. No country understands this sacred rule of seared meat like Turkey.Turkish kebabs are the incarnation of the meat lovers most exotic fantasies, with grilled lamb, beef and chicken as skewer MVPs.Most kebab restaurants also have a long list of Turkish starters called meze that are as delicious as the main dishes.Turkeys best alcoholic complement for all that meat is raki -- an aniseed-flavored drink that s often diluted with water and chilled with ice. Frothy, yogurt-based ayran is a great non-alcoholic complement to heavy dishes. But who are we kidding -- you just want the meat. Heres where to get it in Turkey.";
      io.sockets.emit('changeview', plaintext);
    });
  });
});
process.on('uncaughtException', function (err) {
  console.log('Uncaught Exception: ' + err.message);
});
server.listen(18080);

由于

enter image description here

2 个答案:

答案 0 :(得分:1)

您的客户端正在请求一些长数字URI,但您的处理程序仅接受/的请求(为其发回index.html)。其他请求(比如数字URI)根本就没有处理,这意味着你的浏览器会等待一段时间并最终放弃。

要解决此问题,请添加默认案例并返回404错误:

switch (path) {
  case '/':
    // your current code
    break;
  default:
    send404(res);
}

另外:为什么要在index.html文件的响应中设置这些特定标头? application/zip表示您的index.html应被视为ZIP文件,将内容编码设置为gzip意味着响应是gzip。这两者似乎都不是这样。

答案 1 :(得分:0)

客户端 - 默认连接超时为10秒

我把它减少到500毫秒 - 它几乎在2.92秒内连接 - 之前它需要12.3秒

var conn = io.connect("http://myserver.com:myport/", { transports: transports, 'reconnect': true, 'connect timeout':500});

希望能帮助其他人解决这个问题