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.第三方的中间件