0
点赞
收藏
分享

微信扫一扫

node 中间件笔记

素的盐 2022-03-11 阅读 69

路由模块创建

// 这是路由模块
// 1. 导入 express
const express = require('express')
// 2. 创建路由对象
const router = express.Router()

// 3. 挂载具体的路由
router.get('/user/list', (req, res) => {
  res.send('Get user list.')
})
router.post('/user/add', (req, res) => {
  res.send('Add new user.')
})

// 4. 向外导出路由对象
module.exports = router

使用

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

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

// 1. 导入路由模块
const router = require('./03.router')
// 2. 注册路由模块
app.use('/api', router)  /api为路由前缀可无   访问时 http://127.0.0.1/api 才可访问

// 注意: app.use() 函数的作用,就是来注册全局中间件

app.listen(80, () => {
  console.log('http://127.0.0.1')
})

中间件

定义中间件

const express = require('express')  //导入express模块
const app = express()//创建web服务器
// 定义一个最简单的中间件函数
const mw = function (req, res, next) {
  console.log('这是最简单的中间件函数')
  // 把流转关系,转交给下一个中间件或路由
  next()
}
app.use(mw)
//简化版中间件函数
app.use((req, res, next) => {
  req.time=new Date() // 为 req 对象,挂载自定义属性,从而把时间共享给后面的所有路由 
  console.log('这是最简单的中间件函数')
  next()
})
没\有next() 后边不执行

app.get('/', (req, res) => {
  console.log('调用了 / 这个路由')
  res.send('Home page.'+req.time) 会调用中间件函数中req.time 的值
})
app.get('/user', (req, res) => {
  console.log('调用了 /user 这个路由')
  res.send('User page.'+req.time)  会调用中间件函数中req.time 的值
})

app.listen(80, () => {
  console.log('http://127.0.0.1')
})

没有next() 会搜索不到

定义多个中间件(根据先后顺序来执行)

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

使用局部中间件

const mw1 = function (req, res, next) {
  console.log('这是最简单的中间件函数1')
  // 把流转关系,转交给下一个中间件或路由
  next()
}
const mw2 = function (req, res, next) {
  console.log('这是最简单的中间件函数2')
  // 把流转关系,转交给下一个中间件或路由
  next()
}
app.get('/',mw1,mw2,(req, res) => {
  console.log('调用了 / 这个路由')
  res.send('Home page.'+req.time) 会调用中间件函数中req.time 的值
})
app.get('/user',[mw1,mw2] ,(req, res) => {
  console.log('调用了 /user 这个路由')
  res.send('User page.'+req.time)  会调用中间件函数中req.time 的值
})

 中间件分类

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

应用中间件  挂在app后的     app.use( 中间件)

路由中间件     挂在express后的   express.use(中间件)

错误级别中间件

 express.json

// 通过 express.json() 这个中间件,解析表单中的 JSON 格式的数据
app.use(express.json())
// 通过 express.urlencoded() 这个中间件,来解析 表单中的 url-encoded 格式的数据
app.use(express.urlencoded({ extended: false }))
// 在服务器,可以使用 req.body 这个属性,来接收客户端发送过来的请求体数据
app.post('/user', (req, res) => {
  // 默认情况下,如果不配置解析表单数据的中间件,则 req.body 默认等于 undefined
  console.log(req.body)
  res.send('ok')
})

app.post('/book', (req, res) => {
  console.log(req.body)
  res.send('ok')
})

第三方中间件

监听req的data/end事件

app.use((req, res, next) => {
  // 定义中间件具体的业务逻辑
  // 1. 定义一个 str 字符串,专门用来存储客户端发送过来的请求体数据
  let str = ''
  // 2. 监听 req 的 data 事件
  req.on('data', (chunk) => {
    str += chunk
  })
  // 3. 监听 req 的 end 事件
  req.on('end', () => {
    // 在 str 中存放的是完整的请求体数据
    const body = qs.parse(str)   调用qs.parse()方法 把查询字符串解析为对象 (解析中文)
    req.body = body   将解析出来的请求体对象,挂载为req.body属性上
    next()            调用next函数,执行后续的业务逻辑
  })
})

cors 跨域访问

首先 npm i cors 下载cors模块
// 一定要在路由之前,配置 cors 这个中间件,从而解决接口跨域的问题
const cors = require('cors')导入cors模块
app.use(cors())使用cors

举报

相关推荐

0 条评论