📜  Express.js 挂载事件(1)

📅  最后修改于: 2023-12-03 15:14:57.647000             🧑  作者: Mango

Express.js 挂载事件

在 Express.js 中,可以通过挂载事件(middlewares)来对一些请求(requests)进行处理或者进行一些通用的操作。这些事件可以在应用层级、路由层级或者路由处理函数层级挂载,让代码更为模块化和灵活。

应用层级挂载事件

应用层级挂载事件会在每个请求到达应用的时候被执行。这些事件可以用来进行一些应用级别的操作,例如记录请求日志、设置响应头等。使用 app.use() 或者 app.METHOD() 来挂载应用层级事件,METHOD 可以为任意 HTTP 请求方法(例如 GET、POST 等)。

// 在应用层级挂载事件
const express = require('express')
const app = express()

// 记录请求日志
app.use((req, res, next) => {
  console.log(`${new Date()} - ${req.method} ${req.url}`)
  next()
})

// 设置响应头
app.use((req, res, next) => {
  res.setHeader('Content-Type', 'application/json')
  next()
})

// GET 请求处理
app.get('/', (req, res) => {
  res.send('Hello World!')
})

app.listen(3000, () => {
  console.log('Example app listening on port 3000!')
})

在以上例子中,我们在两个应用层级事件中,分别记录请求日志并设置响应头;然后,我们对 GET 请求进行了处理。

路由层级挂载事件

路由层级挂载事件会在每个请求到达路由的时候被执行。这些事件可以用来进行一些路由级别的操作,例如权限校验、参数校验等。使用 router.use() 或者 router.METHOD() 来挂载路由层级事件,METHOD 可以为任意 HTTP 请求方法(例如 GET、POST 等)。

// 在路由层级挂载事件
const express = require('express')
const app = express()
const router = express.Router()

// 权限校验
router.use((req, res, next) => {
  if (req.headers['authorization'] !== 'token') {
    res.status(401).send('Unauthorized')
  } else {
    next()
  }
})

// 路由处理
router.get('/', (req, res) => {
  res.send('Hello World!')
})

app.use('/api', router)

app.listen(3000, () => {
  console.log('Example app listening on port 3000!')
})

在以上例子中,我们在路由层级挂载了一个权限校验的事件,如果请求中的 authorization 头不为 token,则返回 401 Unauthorized 响应。

路由处理函数层级挂载事件

路由处理函数层级挂载事件会在路由处理函数被执行之前被执行。这些事件可以用来进行一些路由处理函数级别的操作,例如日志记录、缓存控制等。使用传递给路由处理函数的回调函数来进行挂载。

// 在路由处理函数层级挂载事件
const express = require('express')
const app = express()
const router = express.Router()

// 日志记录
const logHandler = (req, res, next) => {
  console.log(`${new Date()} - ${req.method} ${req.url}`)
  next()
}

// 缓存控制
const cacheHandler = (req, res, next) => {
  res.set('Cache-Control', 'private, max-age=600')
  next()
}

// 路由处理
router.get('/', logHandler, cacheHandler, (req, res) => {
  res.send('Hello World!')
})

app.use('/api', router)

app.listen(3000, () => {
  console.log('Example app listening on port 3000!')
})

在以上例子中,我们在路由处理函数层级挂载了一个日志记录事件和一个缓存控制事件,这两个事件分别记录了请求日志并设置了缓存策略。这两个事件会在最后的路由处理函数之前被执行。