javascript - Node Express - 路由路径冒号参数异常

标签 javascript regex node.js express

目前我的应用程序中有两条路线:

/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/

相关文章:

javascript - 如何使用QWebChannel从python接收数据到js?

javascript - 为什么源 map 不起作用?

php preg_split 忽略重复的分隔符

javascript - 使用 JavaScript 正则表达式进行全局匹配

javascript - 发送 jsonp 请求phonegap 时捕获响应

javascript - Node.js如何实现多态?

javascript - 在继续下一项之前,如何在 for 循环中为一项运行函数?

javascript - 悬停在 div 上有时不会变回原来的颜色

javascript - 如何在 XML 中插入多个/不同的隐藏字段?

javascript - 使用正则表达式查找 URL 中的特定字符串