1

我正在尝试运行一些简单的 node.js 代码,这个 hello world 可以正常工作:

var http = require('http');

var server = http.createServer(function (request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.end("Este node.js criou um servidor\n");
});


server.listen(8000);

但是当我尝试运行这个应该足够简单的浏览器时,浏览器(尝试过 IE 和 chrome)会长时间保持加载,然后超时。可能是什么问题呢?

var http = require("http"),
fs = require("fs");
http.createServer(function (request, response) {
   request.on('end', function () {
      if (request.url == '/') {
         fs.readFile('test.txt', 'utf-8', function (error, data) {
            response.writeHead(200, {
               'Content-Type': 'text/plain'
            });
            data = parseInt(data) + 1;
            fs.writeFile('test.txt', data);
            response.end('This page was refreshed ' + data + ' times!');
         });
      } else {
         response.writeHead(404);
         response.end();
      }
   });
}).listen(8000);

顺便说一句,我在与代码相同的文件夹中创建了 test.txt 文件,其中只有数字 1。

4

3 回答 3

3

结束请求永远不会启动,因为在调用服务器时请求已经完成。删除该行并像这样准备好:

var http = require("http"),
  fs = require("fs");
  http.createServer(function (request, response) {
     // request.on('end', function () {
        if (request.url == '/') {
           fs.readFile('test.txt', 'utf-8', function (error, data) {
              response.writeHead(200, {
                 'Content-Type': 'text/plain'
              });
              data = parseInt(data) + 1;
              fs.writeFile('test.txt', data);
              response.end('This page was refreshed ' + data + ' times!');
           });
        } else {
           response.writeHead(404);
           response.end();
        }
     // });
  }).listen(8000);
于 2013-11-07T00:33:44.950 回答
2

end来自 HTTP 处理程序的请求对象是可读流的实例,在非流动模式下不会发出事件。如果end预期发生事件,则必须恢复流..

如果您不打算收集请求的正文,那么您根本不需要侦听该end事件。您可以只写响应:

http.createServer(function(req, res) {
  if (request.url == '/') {
    fs.readFile('test.txt', 'utf-8', function (error, data) {
      res.writeHead(200, {'Content-Type': 'text/plain'});
      data = parseInt(data) + 1;
      fs.writeFile('test.txt', data);
      res.end('This page was refreshed ' + data + ' times!');
    });
  } else {
    res.writeHead(404);
    res.end();
  }
}).listen();

否则,流可以通过以下任一方式转换为流动模式:

req.resume();
req.on('data', function(chunk) {});
于 2013-11-07T00:34:20.517 回答
0

它看起来的结构方式与我所看到的完全不同。你不应该需要 request.on 结构。一般来说,你可以使用这样的东西:

var http = require("http");

var Start = function(){

    var onRequest = function(request, response){

        response.writeHead(200, {"Content-Type" : "text/plain" });
        response.write("HEllo World");
        response.end();
    }

    http.createServer(onRequest).listen(8888);
}

exports.Start = Start;

导出的原因是您可以从另一个文件启动它(如果您要采用建议的模块化设计,这很好。至于加载文件 - 您的加载方式可能有效,但问题是它只会服务器文本文件 - 尝试使用 html 文件将失败,您可能还希望提供 html 文件以及 .js 和 .css 文件(以及其他任何文件,例如图片)。因此,请参阅我的答案很长,其中包含大量代码,位于以下链接中:单击此处

于 2013-11-07T04:20:55.987 回答