2016-09-22 153 views
0

由于express按照它们添加的顺序评估路由,因此应首先放置更具体的路由。快速路由器:允许新路由的所有路由

server.get('/product/:id', router.getProduct); 
server.get('/user/:id', router.getUser); 
server.get('*', router.notFound); 

但是,网站的管理方需要能够创建新的部分。当一个新的部分被创建时,它被添加到数据库中,然后创建一个新的路由。但是,*路线捕获所有内容并在新节路线之前添加。因此,新的路段路线永远不会匹配。

如果我删除*路线,那么新路段的路线确实匹配。我的问题是如何在404请求中创建匹配的路由,而不使用*路由。或者有没有办法在路由匹配顺序的最后添加一个始终匹配的路由?

任何帮助表示赞赏。

+0

节名URL如何命名?或者是完全武断的? – robertklep

+0

好吧,它必须由管理员决定,所以是的,他们可以输入任何他们喜欢的东西。至少这是主意。也许解决方案是重新配置路由的命名方式? – BishopZ

回答

1

由于部分可以有任意名称,你可以查询到在包罗万象的处理程序的有效性。这将取决于你的代码是如何准确地设置,而是给一个想法:

server.get('/product/:id', router.getProduct); 
server.get('/user/:id', router.getUser); 
server.get('*', function(req, res, next) { 
    let sectionName = req.url.substring(1); 
    Sections.findByName(sectionName, (err, section) { 
    // Pass errors to the generic error handler. 
    if (err) return next(err); 

    // If the section isn't known, pass it along. 
    if (! section) return next(); 

    // Perform the section code here. 
    ... 
    }); 
}); 
server.use(router.notFound); 

换句话说:在get('*')路线将采取请求的路径,去掉前导斜杠(除非这部分部分名称),在数据库中查找它,并处理错误或未知部分名称。

最终处理程序将为通过区段处理程序的请求生成404。