首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >节点服务器问题

节点服务器问题
EN

Stack Overflow用户
提问于 2013-10-08 17:16:08
回答 2查看 238关注 0票数 0

我是一个完全的节点新手,我遇到了一个问题:

代码语言:javascript
复制
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),我会得到

EN

回答 2

Stack Overflow用户

发布于 2013-10-08 17:48:47

您应该在写入之后调用.end。

代码语言:javascript
复制
response.writeHead(404, {'Content-Type': 'text/html'});
response.write(data, 'utf8');
response.end();

http://nodejs.org/api/http.html#http_response_end_data_encoding

票数 1
EN

Stack Overflow用户

发布于 2013-10-09 11:24:38

my comment扩展

fs.readFile()是一个异步调用,这意味着它将简单地告诉Node尝试打开文件,然后在上移动,而不等待它。因此,通过下面的代码:

代码语言:javascript
复制
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();

这段代码的作用是:

  1. You:“嘿,Node,帮我打开这个文件;完成后告诉我”;
  2. You:“结束响应,我以后不需要那个响应时间)

Node:"Hi,文件准备好了。“

你:“酷,现在把文件写到响应流。”

Node:"...WTF man,您已经关闭了流!“

(好的,我添加了最后一行)

因此,要执行预期的操作,您有两个选择:

  1. 使用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,我猜这就是您实际的意思。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19243650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档