route-path-match
v1.1.0
Published
compile route path template, match route path params
Maintainers
Readme
route-path-match - 路由路径匹配
安装
npm i -D route-path-match
# or
pnpm add -D route-path-match路径匹配示例
import { parsePathTpl, matchPathParams } from "route-path-match";
const pathMatcher = parsePathTpl("/:group/:id");
const params = matchPathParams(pathMatcher, "/items/aaa");
if (params) {
console.log("path matched", params);
// params -> { group: 'items', id: 'aaa' }
} else {
console.log("path unmatch");
}路径模板规则
- 通配符:
- 匿名通配符: 形似 * 与 ** 前者匹配除/之外的字符,后者匹配任意字符,可以通过 *<\d+> 的形式自定义正则
- 具名通配符: 形似 :id 与 ::id 可捕获变量名,其含义和用法同匿名通配符,可以通过 :id<\d+> 的形式自定义正则
- 变量名:只支持使用驼峰形式,形如 :groupId
- 适配正则:
- 继承正则: ( ) 与 ? 等3个字符为正则的含义及用法,即分组与可选
- 自定义通配符正则: id<[0-9]+|all> 其中 < > 字符会被替换为 ( ) 其中包裹的内容会被识别为该变量的正则表达式。其中的反斜杠需要转义,如 \d+
路径模板示例
- /assets/::filePath
- /:group/:id
- /:group/:id<[0-9]+>
- /:group/:id<[0-9]+>(:extname<\.html|\.xml>)?
- /:group/:id?
- /:group(/:id)?
- /:group<items|users|images>(/:id)?
路由匹配示例
import { ExpressRouter } from "route-path-match/server";
const notFound = async (req, res) => {
res.end('not found')
}
const resolvePage = async (req, res) => {
res.end('some page html')
}
const initDb = async (req, res) => {
req.db = 'some db connection'
}
const routes = [
{
method: 'OPTIONS',
path: '*',
response: ''
},
{
path: '/pages/1',
handler: [ initDb, resolvePage ]
},
{
path: *,
handler: notFound
}
];
const router = new ExpressRouter(routes);
import express from 'express'
const app = express()
const hookTasks = {
onRoute: (route, req, res) => {},
onError: (err, req, res) => { console.error(err) },
onFinish: (req, res) => {},
onStart: (req, res) => {},
onEnd: (req, res) => {},
}
app.use((req, res) => router.handle(hookTasks, req, res))
app.listen(8080)