node js为同一请求呈现不同的页面

时间:2013-09-20 09:15:11

标签: javascript node.js html-rendering

我是nodejs的新手。我一直在尝试编写一个简单的Web服务器并呈现html页面。我不想在这个阶段使用Express或其他框架,因为我试图深入了解。

我的问题是:在启动服务器后第一次加载页面时,它会加载默认的响应值。在每次备用加载之后,它显示默认页面(404 Not Found)和正确的HTML。

这是第一次加载时的服务器登录(当显示'default'作为响应时):

  • 请求提交/已收到
  • 即将发出请求/
  • 这是主页
  • content-type text / html
  • 文件阅读结束......

刷新时,服务器日志完全相同,但会显示实际页面。

进一步刷新后,我得到404 Not Found,这是我的路由器的默认情况。 服务器日志再次相同。

这是server.js代码:

var http = require('http');
var url = require('url');

function start(route){
   function onRequest(request, response){
     var pathname = url.parse(request.url).pathname;
     console.log('request for url '+pathname+' received');
     resp = route(pathname);
     console.log('content-type '+resp['ctype']);
     response.writeHead(200, {'Content-Type':resp['ctype']});
     response.write(resp['file'].toString());
     response.end();
    }
   http.createServer(onRequest).listen(8888);
   console.log('Server Has Started');
  };
exports.start = start;

这是路由器代码:

var fs = require('fs'),
    datafile={'file':'default', 'ctype':'text/html'};

function read_html(filename){
   fs.readFile(filename, 'utf-8', function(err, data){
      if (err){console.log(err);}
      else {datafile['file'] = data;console.log('FILE READING FINISHED ...\n');}
   }); 
}

function route(pathname){
  console.log('About to route for request '+ pathname);
  switch(pathname){
  case '/': 
     console.log('this is the home page');
     read_html('./index.html');
     datafile['ctype']='text/html';
  break;
  case '/features':
     console.log('this is the FEATURES page');
     read_html('./features.html');
     datafile['ctype']='text/html';
  break;
  case '/css/root.css':
     console.log('this is the CSS');
     read_html('./css/root.css');
     datafile['ctype']='text/css'; 
  break;
  default:
     datafile['file'] = '404 Not Found\n';
     datafile['ctype']='text/html';
     console.log('404 NOT FOUND');
  break;
}
return datafile;
}

未优化代码的Aplogies。

1 个答案:

答案 0 :(得分:1)

我不知道这是否是你问题的核心,但这是错误的。我对你的代码做了一些评论,希望这会有所帮助:

function read_html(filename){
    // STEP 1
    fs.readFile(filename, 'utf-8', function(err, data) {
        // STEP 10, you can absolutly not say what
        // happens since you called read_html
        if (err){
            console.log(err);
        }
        else {
            datafile['file'] = data;
            console.log('FILE READING FINISHED ...\n');
        }
    }); 
    // STEP 2, we'll exit the function
}

尝试阅读有关异步概念以及如何在node.js中处理数据的更多信息。