中间件(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()