Express
1.定义:Express是基于Node.js平台,快速,开放,极简的Web开发框架【专门来创建Web服务器的】
2.本质:是npm上的第三方包,提供了快速创建Web服务器的便捷方法
3.最常见的两种服务器:
①Web网站服务器:专门对外提供Web网页资源的服务器
②API接口服务器:专门对外提供API接口的服务器
使用Express可以方便快捷的创建上述两个网站服务器
4.安装express: npm i express@4.17.1
创建基本的Web服务器
(1)导入express
(2)创建web服务器
(3)调用.listen(端口号,启动成功后的回调函数)
(4)启动服务器
const express=require('express')
const app=express()
app.listen(8080,function(){
console.log('服务器已经启动成功at http://127.0.0.1:8080');
})
2.监听GET/POST请求:通过app.get()方法,可以监听到客户端的GET请求
语法格式:
app.get('请求的URL地址',请求对应的回调函数)
app.post('请求的URL地址',请求对应的回调函数)
请求对应的回调函数的形参包括了
①req:请求对象:包含了与请求相关的属性和方法
②res:x响应对象 包含了与响应相关的属性和方法
3.把内容响应给客户端
通过res,send()方法,可以吧处理好的内容发送给客户端
// 通过监听post 和get请求 并向客户端响应具体的内容
app.get('/user',(req,res)=>{
res.send({
name:'张三',
age:18
})
})
app.post('/user',(req,res)=>{
console.log('请求成功');
})
4.获取URL中携带的查询参数:req.query可以访问到客户端通过查询字符串的形式,发送到服务器的参数
【客户端通过?键值对查询形式,发送到服务器的参数】
默认情况下req.query是一个空对象
在查询地址栏添加参数,通过req.query即可获得
http://127.0.0.1:8080/?name=张三&age=20
app.get('/',(req,res)=>{
console.log(req.query);
res.send(req.query)
})
5.获取URL中的动态参数
通过req.params对象,可以访问到URL中通过:匹配到的动态参数
默认是空对象
app.get('/:id',(req,res)=>{
console.log(req.params);
res.send(req.params)
})
注意:运行是一定要先启动服务器
6.托管静态资源
(1)express.static():非常方便的创建一个静态服务器
(2)使用方法:app.use(express.static(‘要静态托管的文件夹’))
存放静态文件的目录名不会出现在URL中
(3)挂载路径前缀:
app.use('/路径前缀',express.static('静态托管的文件夹'))
挂载了路径前缀的,在URL地址栏也一定要添加上路径前缀
nodemon
1.nodemon可以监听项目文件的变动,当代码被修改后,nodemon会自动帮我们重启项目。
2.安装:npm i -g nodemon
3.使用:nodemon 文件名称
express路由
1.路由:路由就是映射关系
2.Express中的路由:客户端的请求与处理函数之间的映射关系
组成:请求的类型,请求的URL地址,处理函数
语法:app.METHOD(‘请求的URL地址’,请求所对应的处理函数)
其中METHOD可以是get请求也可以是post请求
3.路由的匹配过程:
当请求到达服务器后,需要先经过路由的匹配,匹配成功后才会调用处理函数
路由的匹配按照定义的先后顺序进行匹配,只有请求类型和请求的URL地址同时成功匹配菜户调用对应的处理函数
4.路由的使用
(1)挂载
①npm init -y初始化包的配置文件
②安装express npm i express@4.17.1
const express=require('express')
const app=express()
// 挂载路由
app.get('/',(req,res)=>{
res.send('我是get的请求方式')
})
app.post('/',(req,res)=>{
res.send('我是post的请求方式')
})
app.listen('80',()=>{
console.log('服务器在http://127.0.0.1上已经启动');
})
(2)模块化路由:
将路由抽离为单独的模块的步骤
(1)创建路由模块对应的js文件
(2)调用express.Router()函数创建路由对象
(3)想路由对象上挂载具体的路由
(4)使用module.exports向外共享路由对象
(5)使用app.use()函数注册路由模块
注册路由模块
步骤:
(1)导入路由模块
(2)使用app.use()注册路由模块
app.use()函数的作用,就是来注册会员中间件
为路由模块添加前缀:
app.use('/api',Router)
常见的express中间件
1.中间件:业务流程的中间出路环节
2.中间件调用流程:当请求到达Express服务器后,可以连续调用多个中间件对这次请求进行预处理
3,Express中间件格式:本质上就是function处理函数
中间件函数的形参列里奥中,必须包含next参数
4.next函数的作用:实现多个中间件连续调用的关键,表示把流转关系转交给下一个中间件/路由
5.定义中间件函数:
注意:中间件的业务处理完毕后,必须调用next()函数—表示把流转关系转交给下一个中间件和路由
const express=require('express')
const app=express()
// 定义中间件函数
const m=function (req,res,next){
console.log('这是最简单的中间件函数');
next()
}
app.listen(80,()=>{
console.log('服务器已经在http://127.0.0.1上运行');
})
6.全局生效的中间件:客户端发起的任何请求,到达服务器之后,都会触发的中间件
(1)用法:通过调用app.use*(就可以定义一个全局生效的中间件
app.use(m)
app.use((req,res,next)=>{
console.log('我是简化版的中间件的函数');
})
8.中间件的作用:多个中间件之间,共享一份req和res 可以在上面的中间件统一为req,res对象添加自定义属性和方法,在下面的中间件或者路由之间进行使用
const express=require('express')
const app=express()
// 定义中间件函数
// const m=function (req,res,next){
// console.log('这是最简单的中间件函数');
// next()
// }
// 注册全局生效的中间件
app.use((req,res,next)=>{
// 声明时间
const time=Date.now()
// 为中间件的req挂载StartTime属性
req.StartTime=time;
next()
})
app.get('/',(req,res)=>{
console.log('index页面'+req.StartTime);
})
app.post('/user',(req,res)=>{
console.log('用户页面'+req.StartTime);
})
app.listen(80,()=>{
console.log('服务器已经在http://127.0.0.1上运行');
})
9.定义多个全局中间件
(1)可以使用app.use()连续定义多个全局中间件,请求到达服务器后,会按照中渐渐地定义的先后顺序依次进行调用
const express=require('express')
const app=express()
app.use(function(res,req,next){
console.log('第一个全局中间件');
next()
})
app.use(function(res,req,next){
console.log('第2个全局中间件');
next()
})
app.use(function(res,req,next){
console.log('第3个全局中间件');
next()
})
app.get('/',(req,res)=>{
console.log('主页面');
})
app.post('/user',(req,res)=>{
console.log('用户页面');
})
app.listen(80,()=>{
console.log('服务器已经在http://127.0.0.1上启动');
})
测试结果
第一个全局中间件
第2个全局中间件
第3个全局中间件
主页面
第一个全局中间件
第2个全局中间件
第3个全局中间件
用户页面
10,局部生效的中间件:将局部生效文件卸载请求方式的形参里面
const express=require('express')
const app=express()
const m1=function(req,res,next){
console.log('局部生效中间件1');
next()
}
app.get('/user',m1,(req,res)=>{
console.log('用户页面');
})
app.listen(80,()=>{
console.log('服务器已经在http://127.0.0.1上启动');
})
中间件的使用注意事项
(1)一定要在路由之前注册中间件
(2)客户端发送过来的请求,可以连续调用多个中间件进行处理
(3)执行完中间件的代码之后,一定要调用next()函数
(4)为了防止代码的逻辑混乱,调用next()函数之后不要再写额外的代码
(5)连续调用多个中间件是。多个中间件之间共享req和res对象
中间件的分类
应用级别中间件:绑定到app实例上的中间件
app.get() app.use() app.post()
路由级别中间件:绑定到express.Router()上的中间件
错误级别中间件:
1.作用:专门用来补货整个项目中发生异常错误,防止项目异常奔溃的问题
2.格式:错误级别的中间件function处理函数必须要有4个形参===err,req,res,next
代码实例
app.get('/user',(req,res)=>{
//人为的制造错误
throw new Error('服务器内部放生了错误')
res.send('用户页面')
})
app.use((err,req,res,next)=>{
console.log('发生了错误'+err.message);
res.send('ERROR'+err.message)
})
注明:错误中间件必须注册在所有路由之后
Express内置的中间件
①express.static快速托管静态资源代码
②express.json解析了JSON格式的请求体数据
app.use(express.json())
接收JSON格式的数据
const express=require('express')
const app=express()
// 配置中间
app.use(express.json())
app.post('/user',(req,res)=>{
console.log(req.body);
res.send('ok')
})
app.listen(80,()=>{
console.log('服务器已经在http://127.0.0.1上启动');
})
③express.urlencoded:解析URL-encoded格式的请求体数据
app.use(express.urlencoded({extended:false}))
接收urlencoded数据的格式
const express=require('express')
const app=express()
// 配置中间
app.use(express.json())
app.use(express.urlencoded({extended:false}))
app.post('/user',(req,res)=>{
console.log(req.body);
res.send('ok')
})
app.post('/list',(req,res)=>{
console.log(req.body);
res.send('list is ok')
})
app.listen(80,()=>{
console.log('服务器已经在http://127.0.0.1上启动');
})
第三方的中间件:由第三方开发出来的,按需下载,可以提高项目的开发效率
express写接口
①创建基本的服务器
②创建路由模块
③编写GET接口
步骤:
(1)利用req.query方法获取到客户端通过查询字符串,发送到服务器的数据
(2)调用res.send()方法,把数据响应到客户端【在路由模块对应的文件上编写】
{
status:0, 状态0表示成功,1表示失败
msg:‘状态描述 成功’,
data:query 西药响应给客户端的具体数据
}
router.get('/get',(req,res)=>{
// 拿到客户端通过查询字符串发送到服务器的数据
const query=req.query
res.send({
status:0,
msg:'GET请求成功',
data:query
})
})
// 编写POST接口
router.post('/post',(req,res)=>{
const content=req.body;
res.send({
status:0,
msg:'POST请求成功',
data:content
})
})
express中启用cors夸域资源共享
1.使用cors中间件解决跨域问题
1.安装cors中间件:npm install cors
2.导入中间件
3.在路由之前调用app.use(cors())
const cors=require('cors')
app.use(cors())
CORS响应头部
(1)Access-Control-Allow-Origin:
语法格式:Access-Control-Allow-Origin:!*
其中origin表示指定了允许访问该资源的外域URL
//*表示允许来自任何域的请求
res.setHeader('Access-Control-Allow-Origin','*')
(2)Access-Control-Allow-Headers
作用:默认情况下,CORS仅支持客户端向服务器发送9个请求头,如果客户端向服务器发送了额外的请求头信息,那么就需要在服务器端,通过Access-Control-Allow-Headers对额外的请求头进行声明
(3)Access-Control-Allow-Methods
默认情况下,CORS仅支持客户端发起GET,POST,HEAD请求
如果客户端希望通过PUT,DELETE等方式请求服务器资源,那么就需要Access-Control-Allow-Methods来指明实际请求所允许使用的HTTP方法
res.setHeader('Access-Control-Aloow-Methods','*')
CORS请求的简单分类
根据请求方式和请求头分为两类
①简单请求
②预检请求
JSONP接口
1.JSONP仅支持GET请求
2.创建JSONP接口的注意事项
如果项目中已经开启了CORS跨域资源共享,为了防止冲突,必须在CORS中间件之前声明JSONP接口
3.实现JSONP接口的步骤
(1)获取客户端发送过来的回调函数的名字
(2)得到通过JSONP形式发送给客户端的数据
(3)拼接处一个函数调用的字符串
(4)将拼接的字符串,响应给客户端的
app.use('/api/jsonp',(req,res)=>{
//TODO
// (1)获取客户端发送过来的回调函数的名字
const funcName= req.query.callback
// (2)得到通过JSONP形式发送给客户端的数据
const data={
name:'张三',
age:20
}