Javascript node.js中的我的http.createserver不';不行?
大家好,我今天刚开始学习node.js,在互联网上搜索了很多东西,然后尝试在node.js中编写代码。我使用这两个代码向我显示相同的结果,但最后一个是在我的浏览器上显示错误,比如“找不到页面”。所以请向我解释为什么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' }
// 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
。详情请参阅我的答案。我很感激你的答案。非常感谢。