res.sendfile()不提供javascripts

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

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

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

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

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

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

更新:

这里是“res.sendfile …”的路由:

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

我希望在任何路由上的服务器的所有请求将得到index.html和所有的JS&CSS assosiciated与。

我想这可能会帮助你…

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'); }); 

保存/public文件夹中的home.html/public/javascripts JavaScript文件, /public/javascripts images中的/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> 
 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'); }); 

上面的代码是mine.i希望能帮助你。

为什么不是这样的?

 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); } }); } 

那么最简单的解决scheme就是移动app.use(express.static(path.join(__dirname, 'public')))

在调用app.use(app.router);之前调用app.use(app.router);

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

我在这里做了一个假设,你的路线是按这个顺序声明的:

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

如果确实如此,那么下面的build议成立:

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

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

有关如何工作的一个很好的解释,请看这个问题的答案: node.js / express.js – app.router如何工作?

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

你已经说过这是你的服务器的当前行为:

它似乎像客户端要求的所有的JavaScripts下载与index.html文件信息。

你问了这个问题:

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

有这个要求

我希望在任何路由上的服务器的所有请求将得到index.html和所有的JS&CSS assosiciated与。

你的问题和要求是相互对立的。 服务器将完全发送给客户端,告诉/configuration它。 它要么始终发回index.html ,这正是您的要求所指出的,要么会成功地提供index.html和任何CSS / JavaScript引用这是你原来的问题是什么。

在下面你的评论之一,你已经说:

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

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

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

如果这些假设是正确的,修复是做我最初的build议,并删除这条路线:

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

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

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