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



我想使用 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 的好解决方案?文件网址的正则表达式而不是通配符是否是一种好方法?

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

/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>

。最后更新您的 catch-all 路由以检查是否有人正在尝试加载脚本:

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/,则将 404 :

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

最新更新