【问题标题】:nodejs redenring different pages alternately for same requestnode js为相同的请求交替呈现不同的页面
【发布时间】:2013-09-20 09:15:10
【问题描述】:

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

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

这是第一次加载时的服务器日志(当显示“默认”作为响应时):

  • 请求网址/已收到
  • 关于请求路由/
  • 这是主页
  • 内容类型文本/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;
}

为未优化的代码道歉。

【问题讨论】:

    标签: javascript node.js html-rendering


    【解决方案1】:

    我不知道这是否是您问题的核心,但这是错误的。我为您编写了一些 cmets 代码,希望对您有所帮助:

    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 中处理数据的信息。

    【讨论】:

    • 这可能是它。我在第 2 步又添加了一个记录器,发现在那之后执行了“文件读取完成”。这意味着在每个新请求上,都会提供上一个请求的页面。谢谢。无法在节点中找到关于异步的良好文档。我来自 php/python 背景。如果你能分享一些链接会很棒。
    猜你喜欢
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 2021-05-28
    相关资源
    最近更新 更多