Javascript node.js中的我的http.createserver不';不行?

Javascript node.js中的我的http.createserver不';不行?,javascript,node.js,Javascript,Node.js,大家好,我今天刚开始学习node.js,在互联网上搜索了很多东西,然后尝试在node.js中编写代码。我使用这两个代码向我显示相同的结果,但最后一个是在我的浏览器上显示错误,比如“找不到页面”。所以请向我解释为什么 // JScript source code var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, { 'Content-Type': 'text/plain' }

大家好,我今天刚开始学习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");
这个坏了

为什么?

最后一个不起作用的链接 谢谢你的回答,但我还是不明白这些问题。
最后一个不工作的只有request。在?

上,应用于HTTP服务器的函数是,它提供了两个参数,
request
response
,分别是和的实例

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();

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

网站上的文档说明:

事件:“结束” 当不再提供更多数据时触发此事件

请注意,除非数据被完全消耗,否则不会触发结束事件。这可以通过切换到流动模式,或者反复调用
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请求。否则你可以考虑已经完成的请求,只需发送数据。

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

警告:如果您从未添加“data”事件处理程序,或调用resume(),则它将永远处于暂停状态,并且永远不会发出“end”。 因此,您发布的代码本可以在节点0.8.x上运行,但在节点0.10.x中不起作用


我猜你对请求的“结束”事件还没有触发。实际上,我不确定
请求上是否有“end”事件。。。IIRC在收到请求之前,回调函数甚至不会执行…@Joe请求时会出现“结束”事件,但它仅在需要传输POST或PUT数据时才相关。事件侦听器在完全接收到请求头时执行,但在接收到请求正文之前执行。“最后一个不起作用的请求只有request.on?”-Sarin,如果您不能接受每一行、每一个字符或括号的位置都会对代码的工作产生重大影响,你在任何编程语言方面都不会有什么进步。不,正如你所看到的,我的英语不好。因此,我想确保我能让你们尽可能清楚地理解我的问题。“类
http.ServerResponse
没有结束事件,”-事实上,但他订阅了
request
对象的
end
事件,这是一个
http.IncomingMessage
。详情请参阅我的答案。我很感激你的答案。非常感谢。