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

oha*_*nho 10 node.js express

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

res.sendfile('public/index.html');
Run Code Online (Sandbox Code Playgroud)

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

app.use(express.static(path.join(__dirname, 'public')));
Run Code Online (Sandbox Code Playgroud)

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

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

更新:

这是"res.sendfile ..."的路由:

app.get('/*', index);
Run Code Online (Sandbox Code Playgroud)

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

小智 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');
});
Run Code Online (Sandbox Code Playgroud)

保存home.html里面/public的文件夹和JavaScript文件中/public/javascripts,在图像/public/images,CSS文件的/public/stylesheets文件夹.

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

    <link rel="stylesheet"   type="text/css" href="/styles/home.css" >
    <script src="/scripts/home.js" type="text/javascript"></script>   
Run Code Online (Sandbox Code Playgroud)


dc5*_*dc5 -1

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

\n\n
app.use(app.router);\napp.use(express.static(path.join(__dirname, \'public\')));\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

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

\n\n

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

\n\n

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

\n\n

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

\n\n
\n

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

\n
\n\n

你问了这样的问题:

\n\n
\n

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

\n
\n\n

有了这个要求

\n\n
\n

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

\n
\n\n

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

\n\n

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

\n\n
\n

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

\n
\n\n

我基于此陈述的假设(如有错误,请纠正)

\n\n
    \n
  • 您正在使用客户端模板
  • \n
  • 您从服务器检索的文件是静态的(即,它们需要按原样从服务器提供)
  • \n
  • 您的路由当前按此顺序声明\n\n
      \n
    1. 应用程序.use(应用程序.路由器);
    2. \n
    3. app.use(express.static(path.join(__dirname, \'public\')));
    4. \n
  • \n
  • 您没有进行任何服务器端模板(即所有内容都位于public某处)
  • \n
\n\n

如果这些假设是正确的,解决方法是执行我最初建议的操作并删除此路线:

\n\n
app.get(\'/*\', index);\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
    \n
  • 您index.html将通过静态中间件从服务器按原样检索。
  • \n
  • 您在 index.html 中引用的每个 css/js 文件都将通过静态中间件从服务器返回
  • \n
  • 任何加载模板文件的请求(例如sample.html)都将由您的静态中间件提供服务并返回给客户端而不进行修改
  • \n
\n