11

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

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

在 '/' GET 路线上,并在我的路线上为静态文件表达中间件:

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

似乎客户端要求的所有 javascript 都与 index.html 文件信息一起下载。

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

更新:

这是“res.sendfile ...”的路线:

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

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

4

5 回答 5

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和 JavaScript 文件保存在/public/javascripts、图像在/public/images、css 文件在/public/stylesheets文件夹中。

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

    <link rel="stylesheet"   type="text/css" href="/styles/home.css" >
    <script src="/scripts/home.js" type="text/javascript"></script>   
于 2013-08-29T20:10:06.483 回答
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');

});

上面的代码是我的。我想帮助你。

于 2014-09-20T05:36:27.160 回答
0

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

在你打电话之前起床app.use(app.router);

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

于 2015-01-14T07:39:23.053 回答
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);
        }
     });
}
于 2013-12-07T17:20:03.603 回答
-1

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

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

如果确实如此,那么以下建议成立:

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

如果您删除该路由,index.html那么目录中已经存在的东西应该对您有用,public并且可以由静态中间件提供服务。

有关其工作原理的良好解释,请参阅此问题的答案:node.js / express.js - app.router 如何工作?

基于上述问题的补充更新:

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

似乎客户端要求的所有 javascript 都与 index.html 文件信息一起下载。

你问了这个问题:

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

有这个要求

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

你的问题和要求是相互对立的。服务器将准确地将您告诉/配置它的内容发送回客户端。它要么总是发回index.html正是你的要求所陈述的,要么它会成功地提供index.html它所引用的任何 CSS/Javascript,这就是你原来的问题陈述。

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

我想这样做的原因是因为我正在使用模板,并且 index.html 包装了每个模板。我在客户端上使用 angular,我开始意识到我必须使用渲染引擎才能实现这一点。同样,我的角度客户端定义了部分 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)都将由您的静态中间件处理并返回给客户端而不进行修改
于 2013-08-10T21:43:28.443 回答