2017-03-04 28 views
1

目前,我有我的应用程序两条路线:从猫鼬的发票凭证的节点快车 - 路由路径结肠的参数异常

/invoice/:invoice返回JSON数据

/invoice/preview返回一个HTML模板内的发票预览(注意,这并不总是预览现有的发票,也有可能是不存在的,其中它的数据是通过URL参数提供的,这就是为什么路由不能被/invoice/:invoice/preview

问题

应该有更好的方法来声明这两个特定的路由,因为/invoice/preview路由现在调用这两个处理程序,因为它与两个正则表达式匹配。

如果我们在CSS选择器/invoice/:invoice:not(preview)谈话将是我想要的行为。不幸的是,我没有找到任何文件。

有什么办法来实现这个或任何方式来改善这个端点结构?

回答

2

申报具体路由第一:

router.get('/invoice/preview', ...); 

router.get('/invoice/:invoice', ...); 

快速检查航线声明的顺序,因此一旦它匹配对/invoice/preview的请求(和条件是其处理程序发回响应)时,无特定/invoice/:invoice将不被考虑。

另外,如果:invoice应该始终与一个特定的模式(比如一个MongoDB的ObjectId),可以将路线限制为匹配模式的请求:

router.get('/invoice/:invoice([a-fA-F0-9]{24})', ...); 

这种模式不匹配“预览” ,所以在这种情况下,顺序并不重要。

如果无法做到这一点,你可以创建一个中间件,并会检查是否匹配req.params.invoice“预览”,如果是这样,将沿请求还传下的处理程序链:

let notIfPreview = (req, res, next) => { 
    if (req.params.invoice === 'preview') return next('route'); 
    next(); 
}; 

router.get('/invoice/:invoice', notIfPreview, ...); 
router.get('/invoice/preview', ...); 

(记录here

+0

您的第一个解决方案并不理想,因为由于项目设置,较不具体的将首先声明。然而,正则表达式的解决方案是完美的! –

+1

@KeesvanLierop只是为了完整起见,如果无法为':invoice'创建模式,那么我的答案中还会添加另一个解决方案。 – robertklep