0

所以我正在学习 node.js,我可以成功地将它路由到一个新的 HTML 页面并显示基本文本。但是,当我尝试添加任何其他 javascript、CSS 甚至图像时,它似乎将它们视为加载整个 HTML 文件。

代码太长,无法真正发布,所以我将分享我的 console.log 输出:

  • 收到 /start 的请求。
  • 即将路由 /start 的请求
  • 请求处理程序“开始”被调用。
  • 收到 /socket.io/lib/socket.io.js 的请求。
  • 即将路由 /socket.io/lib/socket.io.js 的请求
  • 找不到 /socket.io/lib/socket.io.js 的请求处理程序
  • 收到 /style.css 的请求。
  • 即将路由 /style.css 的请求
  • 找不到 /style.css 的请求处理程序
  • 收到 /test.jpg 的请求。
  • 即将路由 /test.jpg 的请求
  • 未找到 /test.jpg 的请求处理程序
  • 已收到对 /favicon.ico 的请求。
  • 即将路由 /favicon.ico 的请求
  • 未找到 /favicon.ico 的请求处理程序

我了解整个favicon.ico混乱,但我不知道为什么它会以这种方式处理其他文件。

使用 Node.js 加载页面时我需要做什么/考虑什么?

4

2 回答 2

2

您必须记住 node.js 不是默认情况下在 webroot 目录中提供文件的 Web 服务器。它是一个低级应用程序,它有一个 API 来服务网络和 http 请求。虽然 express.js 公开了一个公共文件夹,您可以在其中放置资源,但它使用与您提到的大致相同的方法获取文件并回复请求。

Node.js 并未完全优化以处理 HTTP 上的服务文件。大多数人在生产环境中所做的是安装反向代理(nginx 是一种流行的选择),以便路由请求。如果在 web 根目录中找到该文件,您可以指示 nginx 简单地提供该文件,否则将请求重定向到 node.js。

于 2013-08-01T16:06:19.220 回答
0

好吧,对于那些像我一样不熟悉的人来说,这是一种使用 Express 来显示最常见文件类型的方法。

    var file_path = "";
    var mimes = {
        'css':  'text/css',
        'js':   'text/javascript',
        'htm':  'text/html',
        'html': 'text/html',
        'png': 'image/png',
        'jpg': 'image/jpg',
        'jpeg': 'image/jpeg'
    };

    // parses the url request for a file and pulls the pathname
    var url_request = url.parse(request.url).pathname;      
    // finds the placement of '.' to determine the extension                
    var tmp  = url_request.lastIndexOf(".");
    // determines the extension by uing .substring that takes everything after '.'
    var extension  = url_request.substring((tmp + 1));

    //set path of static pages
    if (extension === 'css' || extension === 'js' || extension === 'htm' || extension === 'html' || extension === 'png' || extension === 'jpg' || extension === 'jpeg'){
        file_path = url_request.replace("/", "");
    }

    //load needed pages and static files
    fs.readFile(file_path, function (error, data){
        if(error){
            response.writeHeader(500, {"Content-Type": "text/html"});  
            response.write("<h1>FS READ FILE ERROR: Internal Server Error!</h1>");    
        }
        else{
            response.writeHeader(200, {"Content-Type": mimes[extension]});  
            response.write(data);
        }

        response.end();  
    });

我很想知道不使用 Express 的更简洁的方法。

于 2013-08-01T15:59:22.970 回答