Express

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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值