我想使用 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'));
}
});