作为_Node.js_的老框架,_express.js_是现有框架中最全面的。然而,在learning express中,除了那些API之外,框架最重要的是中间件的概念。如果你理解了,就可以活灵活现地玩这个框架,项目开发会更顺畅,还可以开发很多附加功能,甚至中间件扩展开发。
但是只有一件事,那就是很多学习node.js的新小萌学生,即使写了一个博客项目,也不知道它会做什么。当时我在理解上也花了很大的功夫,在没有工作的时候,给大家做了一点学习express.js的指导,当然也可能有koa2和egg的忠实粉丝,但其实所有的节点框架似乎都有这个概念,所以我就以express为例,希望大家能做个处理,应该可以理解。
首先,让我从一波官方解释开始:
好了,被这个英文吓到了,来一波翻译吧:
【中间件功能是可以访问请求对象(req)、响应对象(res)以及应用请求响应周期中下一个功能的功能。下一个功能是快速路由器中的一个功能。当调用这个函数时,它在当前中间件之后执行中间件。
中间件功能可以执行以下任务:
执行任何代码来更改请求和响应对象。结束请求响应周期。调用堆栈中的下一个中间件。最后,我意识到,当我开始理解毛刚时,这是非常困难的。说实话,我真的很困惑。幸运的是,我爬出了这个坑。我来帮你。首先,让我们直接进入前面的代码块,不要进入概念。
如果我们启动服务并访问“/”路由,我们将返回“这是根路由”。当我们访问router1路由时,我们会得到一条消息,这是router1路由。这似乎是一个非常简单的路线查询。让我们梳理一下流程,这个请求是如何访问这个路由的?
一般来说,一个express framework项目会写很多路线,但是你要注意,这个请求并不是直接定位到这个路线,而是一个从上到下匹配的过程。
有点乱?没关系。让我们看看这幅画
我们看到这幅画有一个从上到下的箭头。什么意思,如果用户提出这样的请求?
GET '/router7 ',然后他会从第一条开始一条一条匹配,当他发现有一条路由名称和请求方法相同时,他会立即执行里面的代码,并返回一段文字‘这是router7路由’。这个很好理解,所以现在我有一个需求,就是无论我访问哪条路线,都需要知道访问者的ip地址和我访问的目的地路线,并打印出来生成访问日志。那你做了什么?
我们分析一波,这个程序要被所有的请求执行。如果按照执行的顺序来说,那么这个程序应该放在所有路由的前面,也就是说这个程序是所有路由都要经过的程序,也就是我们所说的中间件。好了,别废话了,编码吧
const fs=required(' fs ')const log=(req,res)={ const ip=req.ip,Route=req。route . path const log=` IP : $ { IP } path : $ { route } ` fs . write file sync(_ dirname/' log ',log)}比如现在我有一个log函数,专门用来记录访问日志。如何一起执行一切,让我们添加一段这样的代码
App.use(log)它被添加到所有代码的顶部,但是如果不添加就完成了,必须在log函数中添加另一个代码,否则,当程序在内部执行时,它就出不来了,这是什么代码?我们重写了日志函数
Const log=(req,res,next)={const IP=req.ip,route=req . route . path const log=` IP : $ { IP } path : $ { route } ` fs . write file sync(_ dirname/' log ',log) next(。前面我们提到过,它其实是一个过渡人,它的主要功能是通过之后继续往下走,或者停下来返回结果。
简单来说,就是一个http请求到达我们的节点服务器后,我们要经过的过程,每次经过一个程序块,它就是一个中间件,只要有next,每个中间件都会传递到下一个中间件,直到服务器res响应结果,整个路由结束。
让我们整合代码。并简化它,再次运行程序
const express=require(' express ')const app=express()const Log=(req,res,next)={ const ip=req.ip,route=req . route . path const Log=` IP : $ { IP } path : $ { route } ` fs . write filesync(_ dirname '/Log ',Log) next()}app.use(log)//任何请求都将通过此日志中间件app传递。get ('/',(req,res)={console。日志(请求。路线。堆栈)res.send('这是根路由!')}) app.get ('/router1 ',(req,RES)={res.send('这是router1路由!')}) app.get ('/router2 ',(req,RES)={res.send('这是router2路由!')})app.listen(3000,()={ console.log('app侦听端口3000!')})GET '/router2' /打印日志并返回结果,这是一个简单的中间件解释。你也可以回去看看你写的代码。是不是对之前的使用有点启发?
以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。