Express 5.0.0移除字符串正则后,如何实现路由参数UUID正则匹配?
在Express 5中实现UUID格式路由参数校验
Express 5移除了字符串形式的正则路由参数语法,要实现和Express 4相同的UUID格式applicationID参数校验,可采用以下两种方案:
方案一:使用Express的param()方法绑定参数校验
Express 5保留了param()方法,专门用于对指定路由参数做格式校验,这是官方推荐的复用性方案:
const applicationContext = Router({ mergeParams: true }); // 为applicationID参数绑定全局校验逻辑 applicationContext.param('applicationID', (req, res, next, value) => { const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; if (uuidRegex.test(value)) { // 校验通过,进入后续流程 next(); } else { // 校验失败,抛出格式错误 const err = new Error('Invalid applicationID format'); err.statusCode = 400; next(err); } }); // 定义路由,无需在路径中嵌入正则 applicationContext.use('/:applicationID', (req, res, next) => { return requireRouteParamsMiddleware(['applicationID'])(req, res, (err) => { if (err) { return next(err); } return setApplicationContext(req, res, next); }); });
方案二:在路由中间件内直接校验
如果不需要全局复用校验逻辑,可在目标路由的中间件内直接对参数做格式检查:
const applicationContext = Router({ mergeParams: true }); const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; applicationContext.use('/:applicationID', (req, res, next) => { // 先校验UUID格式 if (!uuidRegex.test(req.params.applicationID)) { const err = new Error('Invalid applicationID format'); err.statusCode = 400; return next(err); } // 执行原有的参数校验与上下文设置逻辑 return requireRouteParamsMiddleware(['applicationID'])(req, res, (err) => { if (err) { return next(err); } return setApplicationContext(req, res, next); }); });
说明
- 两种方案均能实现原Express 4代码的效果:仅当
applicationID符合UUID格式时,才会执行上下文设置逻辑;否则直接返回错误。 param()方法适合多路由复用同一参数校验规则的场景,无需重复编写校验代码。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

