理解KOA洋葱模型

在JavaScript中实现中间件

·

2 min read

推荐阅读,什么是中间件?

在JavaScript中实现可以扩展的中间件

项目中中间件的设计需要考虑到后期的扩展,马上展示的就是koa中使用洋葱模型的实现方式; 我将一些重要的部分抽离出来最后形成离这样的核心代码。

export function compose(middlewares){
    return function last(next) {
        function dispatch(i){
            let processingFunc = middlewares[i];
            if(i === middlewares.length) {
                processingFunc = next;
            }
            return processingFunc(dispatch.bind(null, i + 1))
        }
        return dispatch(0)
    }
}

compose函数接收一个数组,数组中的每一项都是一个中间件(本质是一个函数),大概如下。函数接收一个调用下一个函数执行的参数next..

function middleware1(next){
    console.log("do something before middleware 01")
    next()
    console.log("do something after middleware 01")
}

最后完整的代码为

export function compose(middlewares){
    return function last(next) {
        function dispatch(i){
            let processingFunc = middlewares[i];
            if(i === middlewares.length) {
                processingFunc = next;
            }
            return processingFunc(dispatch.bind(null, i + 1))
        }
        return dispatch(0)
    }
}

function middleware1(next){
    console.log("do something before middleware 01")
    next()
    console.log("do something after middleware 01")
}

function middleware2 (next){
    console.log("do something before middleware 02")
    next()
    console.log("do something after middleware 02")
}

const middlewares = [middleware1, middleware2];
const fn = compose(middlewares); // ?
fn(last)

function last(){
    console.log("last")
}