我是一个完全的节点新手,我遇到了一个问题:
var http = require("http");
var url = require('url');
var fs = require('fs');
var io = require('socket.io');
var server = http.createServer(function(request, response){
console.log('Connection');
var path = url.parse(request.url).pathname;
switch(path){
case '/':
response.writeHead(200, {'Content-Type': 'text/html'});
response.write('Hello World');
break;
case '/socket.html':
fs.readFile(__dirname + path, function(error, data){
if (error){
response.writeHead(404);
response.write("This doesn't exist - 404");
console.log(error);
} else {
console.log('hi!'); // **************<---- I'm getting here
response.writeHead(404, {'Content-Type': 'text/html'});
response.write(data, 'utf8');
}
});
break;
default:
response.writeHead(404);
response.write("This page does not exist - 404");
console.log(path);
break;
}
response.end();
});
server.listen(8001);
io.listen(server);我正在访问'else‘中的console.log(),但是response.write根本不输出任何东西,如果我console.log(console.log),我会得到
发布于 2013-10-08 17:48:47
您应该在写入之后调用.end。
response.writeHead(404, {'Content-Type': 'text/html'});
response.write(data, 'utf8');
response.end();http://nodejs.org/api/http.html#http_response_end_data_encoding
发布于 2013-10-09 11:24:38
从my comment扩展
fs.readFile()是一个异步调用,这意味着它将简单地告诉Node尝试打开文件,然后在上移动,而不等待它。因此,通过下面的代码:
fs.readFile(__dirname + path, function(error, data){
if (error){
response.writeHead(404);
response.write("This doesn't exist - 404");
console.log(error);
} else {
console.log('hi!'); // **************<---- I'm getting here
response.writeHead(404, {'Content-Type': 'text/html'});
response.write(data, 'utf8');
}
});
response.end();这段代码的作用是:
Node:"Hi,文件准备好了。“
你:“酷,现在把文件写到响应流。”
Node:"...WTF man,您已经关闭了流!“
(好的,我添加了最后一行)
因此,要执行预期的操作,您有两个选择:
fs.readFileSync()同步进行文件打开操作,因此您可以进行您熟悉的“线性”编程:尝试{ var data=fs.readFileSync(__dirname+path,{“编码”:“utf8”});response.writeHead(200,{“内容类型”:“文本/html”});response.write(数据,"utf8");}catch(e){ response.writeHead(400,{“内容类型”:“文本/普通文本”});response.write(“这不存在- 404");} response.end();
fs.readFile()的回调函数中结束响应,而不是在服务器监听器中:开关(路径){ case '/':response.writeHead(200,{‘内容类型’:‘文本/html’});response.write('Hello World');response.end();/*此处*/ break;case '/socket.html':fs.readFile(__dirname +路径,函数(错误,数据){ if (错误){ response.writeHead(404);Response.write(“这不存在- 404");response.end();/* here */ console.log(错误);} else { console.log('hi!');response.writeHead(200,{'Content-Type':‘/*/console.log’});response.write(data,'utf8');response.end();/* here */ } });break;默认值: response.writeHead(404);response.write(“此页不存在- 404");response.end();/* here */ console.log(path);break;} //response.end();<--去掉这行
还请注意,当文件打开成功时,我在writeHead()调用中更改了404 to 200,我猜这就是您实际的意思。
https://stackoverflow.com/questions/19243650
复制相似问题