2016-03-14 69 views
1

我想使用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状态正常吗?对于文件url而不是通配符的正则表达式是否是一个好方法?

回答

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> 

...最后更新包罗万象的路线,以检查是否有人试图加载脚本:

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,字体,图片等,然后您可以更新您的包罗万象的处理程序是这样的,其将404如果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')); 
    } 
}); 
+0

好的,谢谢!什么情况下,当我有20个静态处理程序?我应该创建另一个父目录,把所有的静态文件夹给他们,并验证它在默认路由? – estradowiec

+0

我更新了我的答案以解决您的评论。 20个静态处理程序有点雄心勃勃;) - 您只需要一个静态处理程序,并将您的资产组合在一起。 –

+0

太棒了!我可以使用多个静态处理程序,因为我的应用程序是可插入的。换句话说,应用程序中的每个插件都可以拥有自己的静态资源。 – estradowiec