res.sendfile()不能很好地提供javascripts

时间:2013-08-10 18:33:34

标签: node.js express

我想使用静态文件服务没有任何渲染引擎。 我试过用:

res.sendfile('public/index.html');

在'/'GET路由上,并在我的路由上表示静态文件的中间件:

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

但是似乎客户端要求的所有javascripts都是使用index.html文件信息下载的。

如何成功下载CSS / JS静态文件?

更新

以下是“res.sendfile ...”的路线:

app.get('/*', index);

我希望在任何路由上对服务器的所有请求都会得到index.html,并且所有的JS和CSS都会与之相关联。

5 个答案:

答案 0 :(得分:18)

我想这可能对你有帮助......

app.js档案中......

app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));

app.use("/styles",  express.static(__dirname + '/public/stylesheets'));
app.use("/scripts", express.static(__dirname + '/public/javascripts'));
app.use("/images",  express.static(__dirname + '/public/images'));


// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

app.get('/', function (req, res) {
      res.sendfile(__dirname + '/public/home.html');
});

home.html文件夹中的/public文件夹和/public/javascripts中的JavaScript文件,/public/images中的图片,/public/stylesheets文件夹中的css文件保存。

在HTML文件中,引用应该是您定义的单词(例如:/ scripts / home.js)...就像这样

    <link rel="stylesheet"   type="text/css" href="/styles/home.css" >
    <script src="/scripts/home.js" type="text/javascript"></script>   

答案 1 :(得分:1)

var express=require("express");

var app=express();

app.use('/', express.static(__dirname + '/website/views/'));


app.set("views",__dirname+'/website/views');


app.get("/",function(req,res){
    res.sendfile('index.html');

});

上面的代码是我的。我希望能帮到你。

答案 2 :(得分:0)

为什么不是这样的?

if(req.url == '/') { // Root lookups appear to be mapped to index.html
    next();
} else {
    fname = [disk location of your website] + req.url;
    fs.open(fname, 'r', function(err, fd) {
        if(err) {
            next();
        } else {
            fs.close(fd);
            res.sendfile(fname);
        }
     });
}

答案 3 :(得分:0)

嗯,最简单的解决方案是移动app.use(express.static(path.join(__dirname, 'public')))

在致电app.use(app.router);

之前

这样,静态中间件就会在app.get('/*', index);

之前提供

答案 4 :(得分:-1)

我在这里假设您的路线按此顺序声明:

app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));

如果情况确实如此,则以下建议成立:

这里的问题是app.get('/ *',...)将拦截所有匹配的请求,这基本上就是一切。您的静态中间件无法提供文件服务。

如果删除该路由,那么事情应该适合您,因为index.html已经在public目录中,并且可以由静态中间件提供服务。

有关其工作原理的详细说明,请参阅此问题的答案:node.js / express.js - How does app.router work?

根据上述问题的补充进行更新:

您已将此声明为服务器的当前行为:

  

似乎客户端要求的所有javascripts都是使用index.html文件信息下载的。

您问过这个问题:

  

如何成功下载CSS / JS静态文件?

有此要求

  

我希望在任何路由上对服务器的所有请求都将获得index.html及其所有JS&amp; CSS与之相关联。

您的问题和要求彼此相反。服务器将向客户端发送与您告诉/配置的内容完全相同的内容。它将始终发送回index.html,这正是您的要求所述,或者它将成功提供index.html和它引用的任何CSS / Javascript,这是您原始的问题陈述。

在下面的一条评论中,您已说过:

  

我想要这样做的原因是因为我正在使用模板,而index.html包装了每个模板。我在客户端使用角度,我开始意识到我必须使用渲染引擎才能实现这一点。同样,我的角度客户端定义了部分URL,当它将请求发送到:'/ partial / sample'时,我需要index.html来包装'sample.html'作为实例

我的假设基于这个陈述(如果错误请更正)

  • 您正在使用客户端模板
  • 您从服务器检索的文件是静态的(即,它们需要从服务器提供)
  • 您的路线目前按此订单声明
    1. app.use(app.router);
    2. app.use(express.static(path.join(__ dirname,'public')));
  • 您没有进行任何服务器端模板化(即一切都位于public某处)

如果这些假设是正确的,那么修复就是按照我最初的建议去做并删除这条路线:

app.get('/*', index);

如果你这样做(假设你的资源被正确引用):

  • 您的index.html将通过静态中间件从服务器检索。
  • 您在index.html中引用的每个css / js文件都将通过静态中间件从服务器返回
  • 任何加载模板文件的请求(例如sample.html)都将由您的静态middeware提供服务,并且无需修改即可返回给客户端