代码已提交到
如果我们想给一个url匹配相应的路由,我们会关注两点,请求的url和请求的http方法。 而之前的写法把这两个地方写死了,不利于扩展。
所以这次调整了API
class rabbit{ ... router(method,pathReg,callback) { let obj = { method, pathReg, callback } this.routerArr.push(obj) } }复制代码
rabbit
是我给框架起的名称。 用router函数
向rabbit
对象中注册路由函数函数。路由函数前两个参数method
和pathReg
来进行匹配。node http模块定义的http方法有33种,我看是无法使用之前的类似于app.get()这种API来写了,索性当做一个参数传递。 路由函数第二个参数是 pathReg
,是利用正则表达式匹配url,在rabbit内部,会用pathReg.test(req.url.split("?")[0])
来判断是否匹配路由。
路由函数会把用户注册的匹配规则推到this.routerArr这个数组,并在以这种方式被调用
for(let router of that.routerArr){ if(router.method.toLocaleLowerCase() == req.method.toLocaleLowerCase() && router.pathReg.test(req.url.split("?")[0])){ router.callback(req,res) break }}复制代码
这意味着:每个请求最多匹配一次路由函数,如果多个路由函数都可以匹配到请求的url,先被注册的路由函数会被执行
整个响应http请求的流程是:
一个示例:
const rabbit = require("./rabbit.js")let app = new rabbit()app.router("get",/^\/user\/[a-zA-Z]+[a-zA-Z0-9]*$/,(req,res)=>{ res.end("hi,world")})app.listen(3003)复制代码
这个服务器可以响应任何方法为get
,url为 /user/{ {name}}
的请求