大家好我刚刚开始学习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?
答案 0 :(得分:13)
request
是http.IncomingMessage
的一个实例,它实现了stream.Readable
接口。
http://nodejs.org/api/stream.html#stream_event_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。在节点0.10中,流的工作方式发生了变化。
来自http://blog.nodejs.org/2012/12/20/streams2/
警告:如果您从未添加“数据”事件处理程序或调用resume(),那么它将永远处于暂停状态并且永远不会发出“结束”。 因此,您发布的代码将在Node 0.8.x上运行,但不在Node 0.10.x中。
答案 1 :(得分:10)
您要应用于HTTP服务器的功能是requestListener
,它提供两个参数request
和response
,它们分别是http.IncomingMessage
和{{的实例3}}
类http.IncomingMessage
从底层可读流继承end
事件。可读流不处于流动模式,因此结束事件永远不会触发,因此永远不会写入响应。由于响应在运行请求处理程序时已经可写,因此您可以直接编写响应。
var http = require('http');
http.createServer(function(req, res) {
res.writeHead(200, {
'Content-Type': 'text/plain'
});
res.end('Hello HTTP!');
}).listen();