Javascript Node Express-路由路径冒号参数异常
目前我的应用程序中有两条路线:Javascript Node Express-路由路径冒号参数异常,javascript,regex,node.js,express,Javascript,Regex,Node.js,Express,目前我的应用程序中有两条路线: /invoice/:invoice从Mongoose返回发票文档的JSON数据 /invoice/preview返回HTML模板内发票的预览(注意,这并不总是预览现有发票,也可能是不存在的发票,其数据通过url参数提供,这就是为什么路由不能是/invoice/:invoice/preview) 问题 应该有更好的方法来声明这两个特定的路由,因为/invoice/preview路由现在调用两个处理程序,因为它匹配两个正则表达式 如果我们在CSS选择器中交谈,我想要的
/invoice/:invoice
从Mongoose返回发票文档的JSON数据
/invoice/preview
返回HTML模板内发票的预览(注意,这并不总是预览现有发票,也可能是不存在的发票,其数据通过url参数提供,这就是为什么路由不能是/invoice/:invoice/preview
)
问题
应该有更好的方法来声明这两个特定的路由,因为/invoice/preview
路由现在调用两个处理程序,因为它匹配两个正则表达式
如果我们在CSS选择器中交谈,我想要的行为将是/invoice/:invoice:not(预览)
。不幸的是,我没有找到任何关于这个的文档
是否有任何方法可以实现这一点或改进此端点结构?首先声明更具体的路由:
router.get('/invoice/preview', ...);
router.get('/invoice/:invoice', ...);
Express按照声明的顺序检查路由,因此,一旦它将请求与/invoice/preview
匹配(并提供其处理程序发回响应),就不会考虑不太具体的/invoice/:invoice
或者,如果:invoice
应始终匹配特定模式(例如MongoDBObjectId
),则可以将路由限制为匹配该模式的请求:
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', ...);
(已记录)由于项目设置的原因,您的第一个解决方案并不理想,将首先声明不太具体的解决方案。然而,使用正则表达式的解决方案非常有效@为了完整起见,如果无法为
:invoice
创建模式,那么我在回答中添加了另一个解决方案。