Node.js - 外部JS和CSS文件(仅使用node.js不表达)

时间:2012-08-26 22:51:08

标签: node.js

我试图学习node.js并且遇到了一些障碍。

我的问题是我似乎无法将外部css和js文件加载到html文件中。

GET http://localhost:8080/css/style.css 404 (Not Found) 
GET http://localhost:8080/js/script.css 404 (Not Found) 

(这是当所有文件都在应用程序的根目录中时)

我被告知有点模仿以下应用程序结构,为公共目录添加路由以允许Web服务器提供外部文件。

我的app结构就是这样

domain.com
  app/
    webserver.js

  public/
    chatclient.html

    js/
      script.js

    css/
      style.css

所以我的webserver.js脚本位于app的根目录中,我想访问的所有内容都是'public'。

我还看到this example使用path.extname()来获取位于路径中的任何文件扩展名。 (见最后一个代码块)。

所以我试图结合新的站点结构和这个path.extname()示例,让webserver允许访问我的公共目录中的任何文件,这样我就可以渲染引用外部js的html文件了和css文件。

我的webserver.js看起来像这样。

var http = require('http')
, url = require('url')
, fs = require('fs')
, path = require('path')
, server;

server = http.createServer(function(req,res){

  var myPath = url.parse(req.url).pathname;

    switch(myPath){

      case '/public':

        // get the extensions of the files inside this dir (.html, .js, .css)
        var extname = mypath.extname(path);

          switch (extname) {

            // get the html
            case '.html':
              fs.readFile(__dirname + '/public/chatclient.html', function (err, data) {
                if (err) return send404(res);
                res.writeHead(200, {'Content-Type': 'text/html'});
                res.write(data, 'utf8');
                res.end();
              });
            break;

            // get the script that /public/chatclient.html references
            case '.js':
              fs.readFile(__dirname + '/public/js/script.js', function (err, data) {
                if (err) return send404(res);
                res.writeHead(200, { 'Content-Type': 'text/javascript' });
                res.end(content, 'utf-8');
                res.end();
              });
            break;

            // get the styles that /public/chatclient.html references
            case '.css':
              fs.readFile(__dirname + '/public/css/style.css', function (err, data) {
                if (err) return send404(res);
                res.writeHead(200, { 'Content-Type': 'text/javascript' });
                res.end(content, 'utf-8');
                res.end();
              });
          }
          break;

          default: send404(res);
        }
    });

在public的情况下,我试图通过这个目录中的任何文件夹/文件 var extname = mypath.extname(path); 与我提供的链接类似。

但是当我登录时,'extname'是空的。

有人可以建议我在这里添加或修改我需要的东西吗? 我知道这可以在Express中轻松完成,但我想知道如何只依靠Node来实现同样的事情。

我对此表示感谢。

提前致谢。

6 个答案:

答案 0 :(得分:27)

您的代码存在一些问题。

  1. 您的服务器无法运行,因为您尚未指定要侦听的端口。
  2. 正如Eric所指出的那样,你的案件情况会失败,因为“公开”没有出现在网址中。
  3. 您在js和css响应中引用了一个不存在的变量'content',应该是'data'。
  4. 你的css内容类型标题应该是text / css而不是text / javascript
  5. 不需要在正文中指定'utf8'。
  6. 我重写了你的代码。 注意我不使用case / switch。我更喜欢更简单,如果这是你的偏好,你可以把它们放回去。我的重写不需要url和path模块,所以我删除了它们。

    var http = require('http'),
        fs = require('fs');
    
    http.createServer(function (req, res) {
    
        if(req.url.indexOf('.html') != -1){ //req.url has the pathname, check if it conatins '.html'
    
          fs.readFile(__dirname + '/public/chatclient.html', function (err, data) {
            if (err) console.log(err);
            res.writeHead(200, {'Content-Type': 'text/html'});
            res.write(data);
            res.end();
          });
    
        }
    
        if(req.url.indexOf('.js') != -1){ //req.url has the pathname, check if it conatins '.js'
    
          fs.readFile(__dirname + '/public/js/script.js', function (err, data) {
            if (err) console.log(err);
            res.writeHead(200, {'Content-Type': 'text/javascript'});
            res.write(data);
            res.end();
          });
    
        }
    
        if(req.url.indexOf('.css') != -1){ //req.url has the pathname, check if it conatins '.css'
    
          fs.readFile(__dirname + '/public/css/style.css', function (err, data) {
            if (err) console.log(err);
            res.writeHead(200, {'Content-Type': 'text/css'});
            res.write(data);
            res.end();
          });
    
        }
    
    }).listen(1337, '127.0.0.1');
    console.log('Server running at http://127.0.0.1:1337/');
    

答案 1 :(得分:7)

您可能希望使用像express这样的服务器框架,它允许您设置一个“公共”目录来自动路由静态文件

var express = require('express'),app = express();
app.use(express.static(path.join(__dirname, 'public')));

这种框架的廉价开销真的值得有效“重新发明轮子”的努力

答案 2 :(得分:2)

public未出现在客户端请求的网址中,因此myPath上的切换将始终显示。

答案 3 :(得分:1)

您可以考虑查看Connect中提供的Static中间件。查看Static的源代码可能会为您提供有关如何使用node.js代码执行此操作的一些想法(如果您想在不使用现有库的情况下学习如何执行此操作)。

答案 4 :(得分:0)

    // get the extensions of the files inside this dir (.html, .js, .css)
    var extname = **mypath**.extname(path);

这些都是相反的。应该是:

   var extension = path.extname(mypath);

我可以避免使用变量名的函数名。

答案 5 :(得分:0)

自动更新文件,更新延迟1秒。 格式:app.js | index.htm |的style.css

// packages
const http = require('http');
const fs = require('fs');
// server properties
const hostname = '127.0.0.1';
const port = 3000;
const timer = 300;

//should trigger atualize function every timer parameter
let htmlfile = '';
let cssfile = '';
let jsfile = '';

uptodate();

// should read file from the disk for html
function uptodate()
{
  console.log(1);
   fs.readFile('./index.html', function (err, html) {
    if (err) {
      throw err; 
    }       
    htmlfile = html;
  });
  // should read css from the disk for css
   fs.readFile('./style.css', function (err, html) {
    if (err) {
      throw err; 
    }       
    cssfile = html;
  });

  // should read js file from the disk
  fs.readFile('./app.js', function (err, html) {
    if (err) {
      throw err; 
    }       
    jsfile = html;
  });
  setTimeout(function(){ uptodate(); }, 1000);
}
const server = http.createServer((req, res) => {
  res.statusCode = 200;

  // should send css and js
  if(req.url.indexOf('.css') != -1){ //req.url has the pathname, check if it conatins '.js'
   res.writeHead(200, {'Content-Type': 'text/css'});
   res.write(cssfile);
   res.end();
   return;
  }
  if(req.url.indexOf('.js') != -1){ //req.url has the pathname, check if it conatins '.js'
   res.writeHead(200, {'Content-Type': 'text/javascript'});
   res.write(jsfile);
   res.end();
   return;
  }
  // should send html file via request
  res.writeHeader(200, {"Content-Type": "text/html"});  
  res.write(htmlfile);
  res.end();
});

// should send css and js 

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});