14

大家好,我今天刚开始学习 node.js 并在互联网上搜索了很多东西,然后尝试在 node.js 中编码我使用这两个代码向我显示相同的结果,但最后一个是在我的浏览器上显示错误诸如“找不到页面”之类的东西。所以请向我解释为什么?

// JScript source code
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World\n');
}).listen(1337, "127.0.0.1");
console.log('Server running at http://127.0.0.1:1337/');

这是有效的,但是

// Include http module.
var http = require("http");

// Create the server. Function passed as parameter is called on every request made.
// request variable holds all request parameters
// response variable allows you to do anything with response sent to the client.
http.createServer(function (request, response) {
   // Attach listener on end event.
   // This event is called when client sent all data and is waiting for response.
   request.on("end", function () {
      // Write headers to the response.
      // 200 is HTTP status code (this one means success)
      // Second parameter holds header fields in object
      // We are sending plain text, so Content-Type should be text/plain
      response.writeHead(200, {
         'Content-Type': 'text/plain'
      });
      // Send data and end response.
      response.end('Hello HTTP!');
   });

}).listen(1337, "127.0.0.1");

这个不工作

为什么?

最后一个不起作用的链接 http://net.tutsplus.com/tutorials/javascript-ajax/node-js-for-beginners/ 谢谢你的所有答案,但我仍然不明白这些问题. 最后一个不工作的只有 request.on?

4

2 回答 2

13

request是 的一个实例http.IncomingMessage,它实现了stream.Readable接口。

http://nodejs.org/api/stream.html#stream_event_end上的文档说:

事件:“结束”

当不再提供数据时触发此事件。

请注意,除非数据完全消耗,否则不会触发 end 事件。这可以通过切换到流动模式来完成,或者通过read()反复调用直到结束。

var readable = getReadableStreamSomehow();
readable.on('data', function(chunk) {
  console.log('got %d bytes of data', chunk.length);
})
readable.on('end', function() {
  console.log('there will be no more data.');
});

因此,在您的情况下,因为您既不使用也不read()订阅该data事件,该end事件将永远不会触发。

添加

 request.on("data",function() {}) // a noop

在事件侦听器中可能会使代码工作。

请注意,仅当 HTTP 请求具有正文时,才需要将请求对象用作流。例如对于 PUT 和 POST 请求。否则你可以认为请求已经完成,然后发送数据。

如果您发布的代码是从其他网站直接获取的,则该代码示例可能基于 Node 0.8。在 Node 0.10 中,流的工作方式发生了变化。

来自http://blog.nodejs.org/2012/12/20/streams2/

警告:如果您从未添加“数据”事件处理程序或调用 resume(),那么它将永远处于暂停状态并且永远不会发出“结束”。因此,您发布的代码可以在 Node 0.8.x 上运行,但在 Node 0.10.x 上却不行。

于 2013-10-14T19:17:55.090 回答
10

您应用于 HTTP 服务器的函数是requestListener提供两个参数requestresponse,它们分别是http.IncomingMessage和的实例http.ServerResponse

该类从底层可读流http.IncomingMessage继承事件。end可读流未处于流动模式,因此 end 事件永远不会触发,因此导致响应永远不会被写入。由于在运行请求处理程序时响应已经是可写的,因此您可以直接编写响应。

var http = require('http');

http.createServer(function(req, res) {
  res.writeHead(200, {
    'Content-Type': 'text/plain'
  });
  res.end('Hello HTTP!');
}).listen();
于 2013-10-14T15:25:33.157 回答