初识Express和Express路由和中间件

1.什么是Express

官方给出的概念:Express是基于Node.js平台,快速,开放,极简的web开发框架

通俗的理解:Express的作用和Node.js内置的http模拟类似,是专门用来创建web服务器的

Express的本质:就是一个npm上的第三方的包,提供了快速创建Web服务器的便捷方法

2.Express提供了 一个非常好用的函数,叫做express.static(),通过它,我们可以非常方便地创建一个静态资源服务站,例如,通过如下代码就可以将public目录下的图片,css文件,javaScript文件对外开放访问了

app.use(express.static('public'))

注意:Express在指定静态目录查找文件,并对外提供资源的访问路径,因此,存放静态文件的目录名不会出现爱URl中

3.托管多个静态资源目录

如果要托管多个静态资源目录,请多次调用express.static()函数

app.use(express.static('public'))
app.use(express.static('files'))

访问静态资源文件时,express.static()函数会根据目录的添加顺序查找所需的文件

4.挂载路径前缀

如果希望在托管的静态资源访问路径之前,挂载路径前缀,则可以使用如下的方式

app.use('/public',express.static('public'))

现在,你就可以通过带有/public前缀地址来访问public,目录中的文件了

5.因为在编写调试Node.js项目的时候,如果修改了项目的代码,则需要频繁的手动close掉,然后再重新启动,非常繁琐.现在,我们可以使用nodemon,这个工具,她能够监听项目文件的变动,当代码被修改后,nodemon会自动帮我们重启项目,极大方便了开放和调试

2.Express路由

1.广义来讲,路由就是映射关系

2.在Express中,路径指的是客户端的请求与服务器处理函数之间的映射关系Express中的路由分3部分组成,分别是请求的数据,请求的URL地址,处理函数,格式如下

app.METHOD(PATH,HANDLER)

3.Express中路由的例子

//匹配GET请求,且请求 URL为 /
app.get('/',(req,res)=>{
 res.send('Hello World!')
})


//匹配POST 请求 ,且请求 URL 为 /
app.post('/',(req,res){
 res.send('Got a POSY request')
})

4.路由的匹配过程

每当一个请求到达服务器之后,需要先经过路由的匹配,只有匹配成功之后,才能调用对应的处理函数

在匹配时,会按照路由的顺序进行匹配,如果请求类型和请求的URL同时匹配成功,则Express会将这次请求,转交给对应的function函数进行处理

5.路由的使用(最简单的用法)

在express中使用路由最简单的方式,就是把路由挂载到app上,实例代码如下

const express = require('express')
//创建 Web服务器 命名为app
const app = express()
//挂载路由
app.get('/',(req,res) => {res.send('Hello World.')})
app.get('/',(req,res) => {res.send('Post Request.')})
//启动 Web 服务器
app.listen(80,()=>{ console.log('server running at http://127.0.0.1')})

6.模块化路由

为了方面对路由进行模块化管理,Express不建议将路由直接挂载到app上,而是推荐将路由抽离为独立模块,将路由抽离为单独模块的步骤如下:

1)创建路由模块对应的.js文件

2)调用express.Router()函数创建路由对象

3)向路由对象上挂载具体的路由

4)使用module.express向外共享路由对象

5)使用app.use()函数注册路由模块

3.Express 中间件

1)中间件,特指业务流程的中间处理环节

2)现实生活中的例子 ,在处理污水的这三个中间处理环节,就可以叫做中间件

3)当一个请求到达Express的服务器之后,可以连续调用多个中间件,从而对这次请求进行预处理

4)Express的中间件,本质就是一个function处理函数,注意:中间件函数的形参列表中,必须包括next参数,而l路由处理函数中只包括req和res

5)next函数是实现多个中间件连续调用的关键,他表示把流转关系给下一个中间件或路由

4.Express中间件函数

1)定义中间件函数

可以通过如下的方式,定义一个最简单的中间件函数

//常量mv所指向,就是一个中间件函数
const mv = function(req,res,next){
  console.log('这是一个最简单的中间件函数')
 //注意,在当前中间件的业务处理完毕之后,必须调用 next()函数
 //表示把流转关系转交给下一个中间件函数或者路由
  next()
}

2)全局生效的中间件函数

客户端发起的任何请求,到达服务器之后,都会触发的中间件,叫做全局生效的中间件

通过调用app,use(中间件函数),既可定义一个全局生效的中间件,实例代码如下

//常量mv所指向的,就是一个中间件函数
const mv function (req,res,next){
 console.log('这是一个最简单的中间件函数')
  next()
}
//全局生效的中间件
app.use(mv)

3)定义全局中间件的简化形式

//全局生效的中间件
app.use(function(req.res.next){
  console.log('这是一个最简单的中间件函数')
   next() 
})

4)中间件的作用

多个中间件之间,共享同一份req和res.基于这样的特性.我们可以在上游的中间件中,统一为req或res对象添加自定义的属性或者方法,供下游的中间件或者路由进行使用

5)定义多个全局中间件

可以使用app.use()连续定义多个全局中间件,客户端请求到达服务器之后,会根据中间件定义的先后顺序依次进行调用,实例如下

const express = require('express')
const app = express()

app.use((req,res,next)=>{//第一个全局中间件
 console.log('调用了第一个全局中间件');
 next()
})

app.use((req,res,next)=>{//第一个全局中间件
    console.log('调用了第二个全局中间件');
    next()
   })
app.get('/user',(req,res)=>{     
    res.send('Home page')
})

app.listen(80,()=>{
    console.log('running.....');
})

6)局部生效的中间件 不使用app.use()定义的中间件,叫做局部生效的中间件,实例如下

const express = require('express')
const app = express()

//第一中间件函数 mv1
const mv1=(req,res,next)=>{
    console.log('这是一个中间件函数');
    next()
}
//mv1这个中间件只在"当前路由中生效
app.get('/',mv1,(req,res)=>{
    console.log('ok');
    res.send('Home page')
})

app.get('/user',(req,res)=>{     
    res.send('User page')
})

app.listen(80,()=>{
    console.log('running.....');
})

7)定义多个局部中间件

可以在路由中,通过如下两种等价的方式,使用多个局部中间件

//以下两种写法是完全等价的,可以根据自己的喜好,选择任意一种方式进行使用
app.get('/',mw1,mv2,(req,res)=>{res.send('Home page.')})
app.get('/',[mw1,mv2],(req,res)=>{res.send('Home page.')})

8)了解中间件的5个使用注意事项

1.一定要路由之前注册中间件

2.客户端发过来的请求,可以连续调用多个中间件进行处理

3.执行完中间件的业务代码之后,不要忘记调用next()函数

4.为了防止代码混乱,调用next()函数后不要再写额外的代码

5.连续用多个中间件时,多个中间件之间,共享req和res对象

9)为了方便大家理解和记忆中间件的使用,EXpress官方把常见的中间件用法,分成了5大类,分别是:

1.应用级别的中间件

2.路由级别的中间件

3.错误级别的中间件

4.Experss内置的中间件

5.第三方的中间件

上一篇:2021-10-10Express


下一篇:node.js + express服务端,客户端请求图片,在浏览器出现乱码解决方案