目前我的应用程序中有两条路线:
/invoice/preview
从Mongoose
/invoice/:invoice/preview
会在HTML模板中返回发票预览(请注意,这并不总是预览现有发票,它也可能是不存在的,其数据是通过url参数提供的,这就是为什么路线不能是/invoice/preview
)
问题
应该有更好的方法来声明这两个特定路由,因为/invoice/:invoice:not(preview)
路由现在调用两个处理程序,因为它匹配两个正则表达式。
如果我们在CSS选择器plot(spline(c(0, v)), type = "l")
中讨论,那就是我想要的行为。不幸的是,我没有找到任何相关的文档。
有没有办法实现这个或以任何方式改善这种端点结构?
答案 0 :(得分: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)