# router.use

使用指定的中间件函数或函数,带有可选的挂载路径 path,默认为 "/"。

# 概要

router.use([path], [function, ...] function)

# 描述

使用指定的中间件函数或函数,带有可选的挂载路径 path,默认为 "/"。

此方法与 app.use() 类似。下面描述了一个简单的示例和用例。有关详细信息,请参阅 app.use()

中间件就像一个管道:请求从定义的第一个中间件函数开始,并按照它们匹配的每个路径的中间件堆栈处理方式工作。

const express = require('express')
const app = express()
const router = express.Router()

// simple logger for this router's requests
// all requests to this router will first hit this middleware
router.use((req, res, next) => {
  console.log('%s %s %s', req.method, req.url, req.path)
  next()
})

// this will only be invoked if the path starts with /bar from the mount point
router.use('/bar', (req, res, next) => {
  // ... maybe some additional /bar logging ...
  next()
})

// always invoked
router.use((req, res, next) => {
  res.send('Hello World')
})

app.use('/foo', router)

app.listen(3000)

"mount" 路径被剥离并且对中间件函数不可见。此功能的主要效果是挂载的中间件函数可以在不更改代码的情况下运行,无论其 "prefix" 路径名如何。

使用 router.use()定义中间件的顺序非常重要。它们按顺序调用,因此顺序定义了中间件优先级。例如,通常记录器是您将使用的第一个中间件,以便记录每个请求。

const logger = require('morgan')

router.use(logger())
router.use(express.static(path.join(__dirname, 'public')))
router.use((req, res) => {
  res.send('Hello')
})

现在假设您想忽略对静态文件的日志记录请求,但继续记录 logger()之后定义的路由和中间件。在添加记录器中间件之前,您只需将对 express.static()的调用移至顶部:

router.use(express.static(path.join(__dirname, 'public')))
router.use(logger())
router.use((req, res) => {
  res.send('Hello')
})

另一个例子是从多个目录提供文件,让 "./public" 优先于其他:

app.use(express.static(path.join(__dirname, 'public')))
app.use(express.static(path.join(__dirname, 'files')))
app.use(express.static(path.join(__dirname, 'uploads')))

router.use()方法还支持命名参数,因此您的其他路由的挂载点可以从使用命名参数的预加载中受益。

注意:尽管这些中间件函数是通过特定的路由添加的,但它们运行时是由它们所连接的路径(而不是路由)定义的。因此,如果路由匹配,通过一个路由添加的中间件可以为其他路由运行。例如,此代码显示了安装在同一路径上的两个不同路由:

const authRouter = express.Router()
const openRouter = express.Router()

authRouter.use(require('./authenticate').basic(usersdb))

authRouter.get('/:user_id/edit', (req, res, next) => {
  // ... Edit user UI ...
})
openRouter.get('/', (req, res, next) => {
  // ... List users ...
})
openRouter.get('/:user_id', (req, res, next) => {
  // ... View user ...
})

app.use('/users', authRouter)
app.use('/users', openRouter)

即使身份验证中间件是通过 authRouter添加的,它也会在 openRouter定义的路由上运行,因为两个路由都安装在 /users上。为避免此行为,请为每个路由使用不同的路径。

Last Updated: 6/17/2023, 6:57:19 PM