【问题标题】:How to define a default route excluding static resources如何定义不包括静态资源的默认路由
【发布时间】:2016-06-30 03:30:51
【问题描述】:

我想使用 express.js 为单页应用程序(角度核心)定义默认路由。当请求静态文件并且它在路由中不存在时会出现问题。在这种情况下,将返回默认页面内容,而不是 404 状态(未找到)。示例代码:

var path = require('path');
var express = require('express');
var app = express();
var router = express.Router();
router.use(express.static(path.join(__dirname, '/scripts')));
router.get('*', function(request, response) {
     response.sendFile(path.join(__dirname, 'views/index.html'));
});
app.use(router);
app.listen(80);

是否存在一个很好的解决方案来排除静态文件的默认路由并正确处理状态 404?文件 url 的正则表达式而不是通配符会是一个好方法吗?

【问题讨论】:

    标签: angularjs node.js express routes singlepage


    【解决方案1】:

    您需要能够判断是否正在对脚本文件进行请求。问题是你有一个这样的目录结构:

    /root
      /scripts
        foo.js
        bar.js
    

    您设置了静态处理程序以允许用户像这样加载脚本:

    <script src="/foo.js"></script>
    

    你需要做的是这样设置你的文件夹结构:

    /root
      /static
        /scripts
          foo.js
          bar.js
    

    ...然后设置您的静态处理程序:

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

    ...然后更新您的脚本标签:

    <script src="/scripts/foo.js"></script>
    

    ...最后更新你的包罗万象的路线以检查是否有人试图加载脚本:

    router.get('*', function(request, response) {
        if (request.originalUrl.indexOf("/scripts/") > -1) {
            response.status(404);
            response.send('Nah Nah Nah');
        } else {
           response.sendFile(path.join(__dirname, 'views/index.html'));
        }
    });
    

    更新:最好将所有静态资产保存在 static 文件夹中。您应该按类型对您的资产进行分组:脚本、css、字体、图像等。然后您可以将您的 catch-all 处理程序更新为类似这样的内容,如果 URL 包含 /scripts/、/css/、/img/、或/fonts/:

    var REG_STATIC_ASSET = /\/(?:scripts|css|img|fonts)\//;
    router.get('*', function(request, response) {
        if (REG_STATIC_ASSET.test(request.originalUrl)) {
            response.status(404);
            response.send('Nah Nah Nah');
        } else {
           response.sendFile(path.join(__dirname, 'views/index.html'));
        }
    });
    

    【讨论】:

    • 好的,谢谢!当我有 20 个静态处理程序时,会发生什么情况?我应该创建另一个父目录,将所有静态文件夹放入它们并在默认路由中验证它吗?
    • 我更新了我的答案以解决您的评论。 20 个静态处理程序有点雄心勃勃 ;) - 你只需要一个,只需将你的资产组合在一起。
    • 太棒了!我可以使用多个静态处理程序,因为我的应用程序是可插入的。换句话说,应用程序中的每个插件都可以拥有自己的静态资源。
    猜你喜欢
    • 2015-09-26
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 2014-12-24
    • 2017-06-14
    • 2020-10-13
    • 2011-01-17
    • 1970-01-01
    相关资源
    最近更新 更多