express中间件原理

一.中间件 middleware

1.中间件作用

一个请求发送到服务器后,他的生命周期是:

  • 收到request(请求)
  • 服务端处理
  • 发送response(响应)
    如果业务逻辑复杂,为了明确和便于维护,需要把处理的事情分配成几个部分来做,而每个部分就是一个中间件(在实际请求发生之前hack req和res对象来实现一些功能

2.中间件是什么

中间件其是一个函数,在响应发送之前对请求进行一些操作

function middleware(req,res,next){
    // 做该干的事
    // 做完后调用下一个函数
    next();
}

next也是一个函数,它表示函数数组中的下一个函数

函数数组
express内部维护一个函数数组,这个函数数组表示在发出响应之前要执行的所有函数,也就是中间件数组

使用app.use(fn)后,传进来的fn就会被扔到这个数组里,执行完毕后调用next()方法执行函数数组里的下一个函数,如果没有调用next()的话,就不会调用下一个函数了,也就是说调用就会被终止

3.实现简单express

function express(){
	var funs = [] 	//等待执行的函数组
	var app = function (req,res){
		var i = 0;
		function next(){
			var task = funcs[i++]
			if(!task){
				return
			}
			task(req,res,next)
		}
		next()
	}
	app.use = function (task) {
        funcs.push(task);
    }
    return app; 
}

4.使用中间件

4.1 挂载路由

app.use(route);

4.2 验证token

//token处理
//解析token获取用户信息
app.use(function (req, res, next) {
  var token = req.headers['authorization'];
  if (token == undefined) {
    return next();
  } else {
    vertoken.getToken(token).then((data) => {
      req.data = data;
      return next();
    }).catch((error) => {
      return next();
    })
  }
});
//验证token是否过期并规定那些路由不需要验证
app.use(expressJwt({
  secret: 'zgs_first_token',
  algorithms: ['HS256']
}).unless({
  path: ['/login', '/register']  //不需要验证的接口名称
}))

//token失效返回信息
app.use(function (err, req, res, next) {
  if (err.status == 401) {
    return res.status(401).json({ message: 'token失效' })
  }
})

4.3 设置静态目录

app.use(express.static(path.join(__dirname, 'public')));

4.4 处理异常

app.use((err,req,res,next)=>{
    res.status(200).send("========="+err.stack);
});

4.5 第三方中间件

上一篇:node.js基于express模拟客户端渲染和服务端渲染(基础无模板)


下一篇:快递管理控制台简易版——加入多线程与网络编程(完整版,附完整源码)(Java)