Node Express – pathpath冒号参数例外

目前我有两个路线在我的应用程序:

/invoice/:invoice返回来自Mongoose的Invoice文档的JSON数据

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

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

如果我们在CSSselect器/invoice/:invoice:not(preview)将是我想要的行为。 不幸的是我没有find任何文件。

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

首先声明更具体的路线:

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

Express按照声明的顺序检查路线,所以一旦匹配请求/invoice/preview (并且假设其处理程序发送回应),将不考虑不太具体/invoice/:invoice

或者,如果:invoice应始终匹配特定的模式(比如MongoDB ObjectId ),则可以将路由限制为匹配该模式的请求:

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

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

如果这是不可能的,您可以创build一个中间件来检查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', ...); 

( 在这里logging )