Node Express – pathpath冒号参数例外
目前我有两个路线在我的应用程序:
/invoice/:invoice
返回来自Mongoose的Invoice文档的JSON数据
/invoice/preview
在HTML模板中返回/invoice/preview
的预览(注意,这并不总是预览现有的发票,也可能是不存在的,其数据是通过url参数提供的,这就是为什么路线不能/invoice/:invoice/preview
)
题
应该有一个更好的方法来声明这两个特定的路由,因为/invoice/preview
路由现在调用这两个处理程序,因为它匹配两个正则expression式。
如果我们在CSSselect器/invoice/:invoice:not(preview)
将是我想要的行为。 不幸的是我没有find任何文件。
有什么方法可以实现这个或任何方式来改善这个端点结构?
首先声明更具体的路线:
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})', ...);
这种模式不符合“预览” ,所以在这种情况下,顺序并不重要。
如果这是不可能的,您可以创build一个中间件来检查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', ...);
( 在这里logging )
- 在Node Express服务器上testing远程IP地址行为
- 在开发环境中使用Angular CLI连接express.js
- 用快递上传文件
- 节点检查员与Express 4
- 在Express.js应用程序上传文件
- 在node.js中,如何使用socket.io设置redis并进行expression? 特别使用RedisStore()
- 在Express.js中,我将如何编写一个路由/正则expression式来捕获所有美国州?
- 如何validationExpress Nodejsstring中的body参数是否可以使用express-validation和joi转换为JSON
- NodeJs和ExpressJs不能设置Cookie