如何定义排除静态资源的默认路由

How to define a default route excluding static resources

我想使用 express.js 为单页应用程序(angular 核心)定义默认路由。当请求静态文件但路由中不存在时会出现问题。在这种情况下,将返回默认页面内容而不是 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 的正则表达式而不是通配符是一个好方法吗?

您需要能够判断是否正在为脚本文件发出请求。问题是你有这样的目录结构:

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