目前我的应用程序中有两条路线:
/invoice/:invoice
从 Mongoose 返回发票文档的 JSON 数据
/invoice/preview
返回 HTML 模板内发票的预览(请注意,这并不总是预览现有发票,它也可能是不存在的,其数据是通过 url 参数提供,这就是为什么路由不能是 /invoice/:invoice/preview
)
问题
应该有更好的方法来声明这两个特定路由,因为 /invoice/preview
路由现在调用两个处理程序,因为它与两个正则表达式匹配。
如果我们在 CSS 选择器中进行讨论 /invoice/:invoice:not(preview)
将是我想要的行为。不幸的是我没有找到任何这方面的文档。
有什么方法可以实现这一点或有什么方法可以改进这个端点结构?
最佳答案
先声明更具体的路由:
router.get('/invoice/preview', ...);
router.get('/invoice/:invoice', ...);
Express 按照声明的顺序检查路由,因此一旦它与 /invoice/preview
匹配请求(并且假设其处理程序发回响应),不太具体的 /发票/:发票
不会被考虑。
或者,如果 :invoice
应始终匹配特定模式(例如 MongoDB ObjectId
),您可以将路由限制为与该模式匹配的请求:
router.get('/invoice/:invoice([a-fA-F0-9]{24})', ...);
该模式与“预览”不匹配,因此在这种情况下顺序并不重要。
如果这是不可能的,您可以创建一个中间件来检查 req.params.invoice
是否匹配“preview”,如果是,则传递请求在处理程序链中进一步向下:
let notIfPreview = (req, res, next) => {
if (req.params.invoice === 'preview') return next('route');
next();
};
router.get('/invoice/:invoice', notIfPreview, ...);
router.get('/invoice/preview', ...);
(记录 here )
关于javascript - Node Express - 路由路径冒号参数异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42597517/