1.Express简
app.use() 函数的作用,就是来注册全局中间件
1Express简介
http内置模块使用起来比较复杂,开发效率低,Express是基于http模块的进一步封装
2 基本使用
①监听GET请求
②POST请求
③ 获取URL的查询参数
④ 获取URL中的动态参数
3.静态托管
express.static()
const express = require('express')
const app = express()
//托管clock文件夹,使用express.static()方法
app.use(express.static('./clock'))
app.listen(80, () => {
console.log('express server running at http://127.0.0.1')
})
2. 挂载路径前缀
这样加上挂载前缀后,访问都需加上该前缀/publick
2.Express路由
3.Express中间件
- 多个中间件,按顺序依次执行
路由处理函数:app.on( ‘/’ , (req,res)=>{ })
中间件函数:app.on( ‘/’ , (req,res,next)=>{next () })
2. 全局生效
的中间件
客户端发起的任何请求,到服务器后,都会先触发中间件函数。
通过 app.use(中间件函数) 定义
// 定义一个最简单的中间件函数
const mw = function (req, res, next) {
console.log('这是最简单的中间件函数')
// 把流转关系,转交给下一个中间件或路由
next()
// }
// 将 mw 注册为全局生效的中间件
app.use(mw)
//定义路由
app.get('/', (req, res) => {
console.log('this /')
res.send('Home page')
})
app.listen(80, () => {
console.log('127.0.0.1')
})
3. 中间件的作用
共享
同一份req 和 res ,在上游中间件中 定义req/res属性或方法,下游可以使用
共享,上游定义,下游使用
app.use((req, res, next) => {
// 获取到请求到达服务器的时间
const time = new Date()
// 为 req 对象,挂载自定义属性,从而把时间共享给后面的所有路由
req.startTime = time
next()
})
app.get('/', (req, res) => {
res.send('Home page.' + req.startTime)
})
//User page.Sat Nov 18 2023 10:41:36 GMT+0800 (中国标准时间)
4. 局部生效
的中间件
不适用app.use()定义的中间件
下面代码,中间价函数,只在请求 http://127.0.0.1/时生效
// 1. 定义中间件函数
const mw1 = (req, res, next) => {
console.log('调用了局部生效的中间件')
next()
}
//2.创建路由
app.get('/', mw1, (req, res) => {
res.send('Home page');
})
app.get('/user', (req, res) => {
res.send('User page');
})
中间件分类
1.错误级别中间件
专门捕获整个项目的异常错误,防止项目异常崩溃
用来捕获错误,一定要写在所有路由之后
//1.定义路由
app.get('/', (req, res) => {
throw new Error('服务器错误!')
res.send('Home page')
})
// 2.定义错误中间件,捕获错误
app.use((err, req, res, next) => {
console.log(err.message)
res.send(err.message)
})
2. 内置中间件
在请求段配置中间件
req.body:body请求体参数
const express = require('express')
// 创建 express 的服务器实例
const app = express()
// 注意:除了错误级别的中间件,其他的中间件,必须在路由之前进行配置
// 通过 express.json() 这个中间件,解析表单中的 JSON 格式的数据
app.use(express.json())
app.post('/user', (req, res) => {
// 在服务器,可以使用 req.body 这个属性,来接收客户端发送过来的请求体数据
// 默认情况下,如果不配置解析表单数据的中间件,则 req.body 默认等于 undefined
console.log(req.body)
res.send('ok')
})
// 调用 app.listen 方法,指定端口号并启动web服务器
app.listen(80, function () {
console.log('Express server running at http://127.0.0.1')
})
3.解析表单中间件
①内置的解析方式
extended:false的意思是:不使用第三方的解析方式,只使用自身的解析方式;如果是
true就使用第三方解析方式
const express = require('express')
const app = express()
//通过express.urlencoded()这个中间件,解析表单中的 url-encoded 格式的数据
app.use(express.urlencoded({ extended: false }))
//创建路由
app.post('/book', (req, res) => {
console.log(req.body)
res.send('ok')
})
//启动web服务器
app.listen(80, () => {
console.log('127.0.0.1');
})
②第三方的解析方式
- 运行 npm i body-parser 安装中间件
- 使用require导入中间件 body-parser
- 调用 app.use() 注册并使用中间件
//☆ 第三方的解析body-parser☆
const parser = require('body-parser')
app.use(parser.urlencoded({ extended: false }))
4.监听req的data事件
//定义中间件
// 这是解析表单数据的中间件
app.use((req, res, next) => {
// 定义中间件具体的业务逻辑
// 1. 定义一个 str 字符串,专门用来存储客户端发送过来的请求体数据
let str = ''
// 2. 监听 req 的 data 事件
req.on('data', (chunk) => {
str += chunk//str就得到完整的数据
})
})
4.监听req的end事件
//定义中间件
app.use((req,res,next)=>{
let str=''
//监听req的data事件(传数据)
req.on('data',(chunk)=>{
str+=chunk
})
req.on('end',()=>{
console.log(str)
//把得到的请求体数据解析成对象格式
const body = qs.parse(str)
console.log(body) //得到对象格式的数据
})
})
4.将解析的数据对象挂在为req.body
将解析出的自定义属性命名为req.body,供下游使用
//定义中间件
app.use((req,res,next)=>{
let str=''
//监听req的data事件(传数据)
req.on('data',(chunk)=>{
str+=chunk
})
req.on('end',()=>{
console.log(str)
//把得到的请求体数据解析成对象格式
const body = qs.parse(str)
req.body = body //挂载为req.body
next() //一定要调用next()函数,执行后续的业务逻辑
})
})
app.post('/book',(req,res)=>{
res.send(req.body)
})
效果:
4.CORS 跨域资源共享
1.cors
它是由一系列HTTP响应头组成,这些响应头决定浏览器是否阻止前端js代码跨域获取资源