Node.js使用正则匹配路由.dcm/.v2后缀文件名失效问题
Node.js路由路径正则匹配问题修复
需求说明
开发Node.js服务时需要校验/api/dicom/filename格式的路由,匹配满足以下规则的文件请求:
- 文件名(不含后缀)字符数不少于3个
- 文件后缀为
.dcm或.v2
合法请求路径示例:
/api/dicom/f:/programas/appprog/dicomserver150c/data/86557/1.3.46.670589.30.1.6.1.116520970982.1481396383125.1_0002_000001_16575404220008.dcm
原有代码问题
原有匹配规则无法命中目标路径,存在多处错误:
app.get(/^[A-Za-z_.\/\\:]{3,}.(?:v2|dcm)$/i, (req, res, next) => { console.log(req.path) })
- 正则未匹配固定前缀
/api/dicom/,从路径起始位置就匹配失败 - 字符集
[A-Za-z_.\/\\:]未覆盖路径中存在的数字等合法字符,示例路径中的数字段无法被匹配 - 后缀前的
.未转义,正则中未转义的.代表匹配任意单个字符,规则不严谨 - 未对文件名长度做精准校验,无法满足“文件名字符数不少于3个”的要求
修正后代码
直接替换正则规则即可:
app.get(/^\/api\/dicom\/.+[^/]{3,}\.(?:dcm|v2)$/i, (req, res, next) => { console.log(req.path) // 写入后续业务逻辑 })
正则规则说明
^\/api\/dicom\/:从路径起始位置强制匹配固定路由前缀.+:匹配前缀后任意长度的目录路径部分[^/]{3,}:匹配最后一个斜杠之后、后缀点之前的文件名主体,长度至少3个字符,满足长度要求\.(?:dcm|v2)$:匹配路径末尾的.dcm或.v2后缀,转义后的.仅匹配实际的点字符,$强制匹配到路径结尾,过滤后缀后带多余字符的非法请求- 修饰符
i表示不区分大小写,可兼容.DCM、.V2等大写后缀的请求
内容的提问来源于stack exchange,提问作者Luiz Alves
相关产品推荐
相关产品推荐

