中间件模式

中间件(Middleware) 是一个函数,它可以访问请求对象(request object (req)), 响应对象(response object (res)), 和 web 应用中处于请求-响应循环流程中的中间件,一般被命名为 next 的变量。

中间件的功能包括:

  • 执行任何代码。
  • 修改请求和响应对象。
  • 终结请求-响应循环。
  • 调用堆栈中的下一个中间件。

如果当前中间件没有终结请求-响应循环,则必须调用 next() 方法将控制权交给下一个中间件,否则请求就会挂起。

中间件是一个函数,通过express的use方法接收中间件,每个中间件有express传入的req,res和next参数。如果要把请求传递给下一个中间件必须使用 next() 方法。


 中间件的原理是通过递归实现的

// 中间件流程

var plugin = [];
var index = -1;
var req = { init: 'req'}
var res = { init: 'res'}
function next(){
    index++;
    if(typeof plugin[index] === 'function'){
        plugin[index](req,res,next)
    }else {
        return;
    }
}
// use只是一个回调函数,每次使用的回调函数是同一个对象,所以req.res参数每次更新会覆盖上一次的值。use里面调next方法执行递归,next方法只要满足是函数的条件就会往use里面添加参数,next执行的时候会往下++
var app = {
    use:function(callback) {
        plugin.push(callback)
    },
    start:function(){
        next()
    }
}
app.use(multer)
app.use(Multer({name:'迭代'}))
app.use(function (req,res,next){
    console.log(1)
    req.init = "冰阔乐"
    next()
})

app.use(function (req, res, next) {
    console.log(2)
    console.log(req)
    next()
})

app.use(function (req, res, next) {
    console.log(3)
    next()

})

function multer (req,res,next){
    req.files = "文件"
    next()
}

function Multer (config){
    return function (req,res,next){
        req[config.name] =  "cc"
        next()
    }
}
app.start()

猜你喜欢

转载自blog.csdn.net/qq_38017417/article/details/80117129