如何定义不包含静态资源的默认路由

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

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

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

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

 /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文件夹中是个好主意。 你应该按照types分类你的资产:脚本,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')); } });