如何使用ExpressJS管理缺少的静态文件,为单页应用程序提供服务?

时间:2017-12-12 13:59:57

标签: javascript node.js express

在我的应用程序中,来自浏览器的所有查询都带有" / _ / *"转到我的静态文件夹:

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

然后所有GET转到/转到HTML文件(HTML5 mode中的单页应用程序):

app.get('/*', function(req, res) {
  //some request preprocessing in done here...
  hbs.render(path.join(__dirname + '/apps/home.html')).then(function (data) {
        res.send(data);
    });
});

除非缺少静态文件,否​​则这很有用。如果我的HTML调用' / _ / iDontExist.js',则来自express的静态中间件找不到该文件并传播由app.get('/*'匹配的事件。

这是不正确的,如果网址以' / _'开头,我希望Angular回复404。并且文件不存在,而不是尝试将URL与我链中的其他路径匹配。

3 个答案:

答案 0 :(得分:0)

更改app.get('/*',以便在网址无法解析为真实网页时发送404。

嗯,这就是简单的答案。

您可能正在使用历史记录API编写SPA,该API旨在让您将SPA中的网址映射到真实网址。

这是一个很棒的设计,因为它允许您在直接请求页面时生成相同的HTML,或者在使用JS修改一个页面将其转换为另一个页面时动态更新URL。 (这使您可以进行动态更改,仅修改DOM的一小部分以提高性能)。

如果您没有正确实施并忘记服务器,就会遇到问题。

有一个令人讨厌的趋势(Angular的文档告诉你这样做没有帮助!)将每个URL放到相同的,几乎是空的HTML文档,并依赖于JS生成所有内容。

这意味着您将失去初始页面加载包含所有内容的性能优势。

您失去了不支持JS查看页面的客户的能力。

当JS失败for whatever reason时,你就失去了后备。

你最终会得到一堆重复的网址,这些网址都指向同一个无内容页面(对搜索引擎来说可能不是很好吃)。

如果您没有从服务器提供真实页面,您可能也在使用hashbangs。虽然他们有lots of problems,但使用没有系统服务器端部分的历史API会分享这些问题并引入更多问题。

所以,良好的解决方案是构建代码的服务器端(你应该调查术语"同构js")然后你可以{{1}对于任何找不到的页面。

不太好的解决方案是切换到使用hashbag并将404更改为'/*'

使用历史记录API的脏问题就是只检查'/'处理程序中的网址,如果它以/*

开头,则检查404

答案 1 :(得分:0)

您可以创建自己的小型中间件 - 例如:

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

var dontAcceptUnderscorePath = function(req, res, next){
 if(req.url.startsWith('/_'))
    res.status(404).send();
  else
    next();
}

app.get('/*', dontAcceptUnderscorePath, function(req, res) {
   //some request preprocessing in done here...
   hbs.render(path.join(__dirname + '/apps/home.html')).then(function (data) {
    res.send(data);
   });
});

答案 2 :(得分:0)

请勿将重定向内容与以_开头的index.html匹配。

app.get(/^[^_].*$/, function(req, res) { // or perhaps /^(?!_).*$/

});

然后处理下面的404.