关于执行顺序的问题

来源:10-17 -总结

凛凛凛世

2020-04-29

老师,这一段数组合并应该是有问题的,这样操作会导致use方法传来的中间件先执行然后再执行get或者post中的中间件方法
图片描述
我想到的解决方案是在register函数里面设置一个自增量作为info的属性来判断顺序
改进后的代码

constructor() {
        // 存放中间件的列表
        this.routes = {
            // use的方法存放在all里面
            all: [],
            // get的方法存放在get里面
            get: [],
            // post的方法都放在post里面
            post: []
        }
        this.times = 0
    }

    // 用来分析第一个参数
    register(path) {
        const info = {}
        // 没有输入第一个参数就是根路由 arguments就是function
        info.times = this.times++
        if(typeof  path === 'string'){
            info.path = path
            info.stack = slice.call(arguments, 1)
        }else{
            info.path = '/'
            info.stack = slice.call(arguments, 0)
        }
        return info
    }
match(method, url){
        let stack = []
        if(url === '/favicon.ico'){
            return stack
        }

        // 获取route
        let curRoutes = []
        // FIXME
        let curTime = 0
        let curAll = 0
        let curMethod = 0
        while(curTime < this.times) {
            console.log(curTime)
            if (this.routes.all.length === 0) {
                curRoutes = curRoutes.concat(this.routes[method])
                break
            } else if (this.routes[method].length === 0) {
                curRoutes = curRoutes.concat(this.routes.all)
                break
            } else if (this.routes.all[curAll] && this.routes.all[curAll].times === curTime){
                curRoutes.push(this.routes.all[curAll])
                curAll++
                curTime++
            } else if (this.routes[method][curMethod] && this.routes[method][curMethod].times === curTime){
                curRoutes.push(this.routes[method][curMethod])
                curMethod++
                curTime++
            // 没有匹配
            } else {
                curTime++
                continue
            }
        }
        // curRoutes = curRoutes.concat(this.routes.all)
        // // curRoutes = curRoutes.concat(this.routes[method])
        // console.log(this.routes.all)
        // console.log(this.routes[method])

        curRoutes.forEach(routeInfo => {
            // 如果根目录==='/api' url==='/api/get-cookie'
            // 用来判断这个条件成立就push进stack
            if(url.indexOf(routeInfo.path) === 0) {
                //routeInfo => curRoutes => this.routes.xx => register/info
                stack = stack.concat(routeInfo.stack)
            }
        })
        return stack
    }

老师你看一下这样可行吗,还有没有什么问题

写回答

2回答

自胜者强123

2022-06-22

同学,我看你的代码写得太复杂了,不好理解,我的解决方案是添加一个属性sort

constructor() {
// 存放中间件
this.routes = {...}
this.sort = 0
}


register(path) {
const info = {}
.......
info.sort = this.sort
this.sort++
return info
}


match(method, url) {
........
// 获取routes
let curRoutes = []
curRoutes = curRoutes.concat(this.routes.all)
curRoutes = curRoutes.concat(this.routes[method])

// 排序
curRoutes = curRoutes.sort((a, b) => a.sort - b.sort)

curRoutes.forEach....
return stack
}


// 排序
curRoutes = curRoutes.sort((a, b) => a.sort - b.sort)

最后排序一下连接的数组就可以了

0
0

双越

2020-04-29

看代码逻辑没啥问题。运行测试一下,如果 OK 那就可以。

0
0

Node.js+Express+Koa2+Nest.js 开发服务端

从入门到实战,一站式掌握 Node.js+Express+Koa2

4051 学习 · 2006 问题

查看课程