Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node Express-路由路径冒号参数异常_Javascript_Regex_Node.js_Express - Fatal编程技术网

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
应始终匹配特定模式(例如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', ...);

(已记录)

由于项目设置的原因,您的第一个解决方案并不理想,将首先声明不太具体的解决方案。然而,使用正则表达式的解决方案非常有效@为了完整起见,如果无法为
:invoice
创建模式,那么我在回答中添加了另一个解决方案。