我想使用express.js为单页面应用程序(angular core)定义默认路由。请求静态文件时出现问题,并且路由中不存在该问题。在此方案中,返回默认页面内容而不是404状态(未找到)。示例代码:
{{1}}
是否存在一个很好的解决方案来排除静态文件的默认路由并正确处理状态404?文件网址的正则表达式而不是通配符是一种好方法吗?
答案 0 :(得分:2)
您需要能够判断是否正在为脚本文件发出请求。问题是你有一个像这样的目录结构:
/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,字体,图像等。然后,您可以将全部捕获处理程序更新为此类,如果网址包含/scripts/
,/css/
,则会将404更新为/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'));
}
});