
作为 Node.js 生态中应用最广泛的轻量 Web 框架,Express 的核心设计理念就是“中间件组合”,而 `app.use()` 正是串联所有中间件逻辑的核心 API。很多初学者刚接触 Express 时会觉得路由、请求解析、权限校验逻辑分散,其实只要吃透 `express.use` 的用法,就能理清 Express 的整个请求处理流程。

`app.use()` 的基础语法为 `app.use([path,] callback [, callback...])`,其中 `path` 是可选的匹配路径,默认值为 `/`,也就是匹配所有请求;后面可以传入一个或多个回调函数,这些函数就是所谓的“中间件”,会按照注册顺序依次执行。每个中间件函数都会接收 `req`(请求对象)、`res`(响应对象)和 `next`(控制权传递函数)三个参数,只有调用 `next()` 时,请求才会进入下一个中间件或路由处理逻辑,否则请求会直接挂起。我们可以把中间件比作请求流水线上的工人,每个工人负责一道工序,处理完就把产品传给下一个人,遇到问题就直接转到售后环节,这个比喻非常贴合 `use` 的实际工作模式。比如实现全局请求日志功能,就可以用 `use` 注册一个全局中间件:
```javascript
const express = require('express');
const app = express();
// 全局日志中间件,匹配所有请求
app.use((req, res, next) => {
console.log(`[${new Date().toLocaleString()}] ${req.method} ${req.url}`);
next(); // 传递控制权给下一个中间件/路由
});
app.get('/', (req, res) => res.send('首页'));
app.listen(3000, () => console.log('服务启动在3000端口'));
```
如果给 `use` 传入第一个路径参数,就可以实现“前缀匹配”的中间件——只要请求路径的前缀和指定路径一致,就会触发中间件,这和 `app.get`、`app.post` 等路由方法的完全匹配规则不同,也是很多新手容易踩坑的点。比如要给所有 `/admin` 开头的接口加权限校验,就可以这样写:
```javascript
app.use('/admin', (req, res, next) => {
const token = req.headers.authorization;
if (token === 'admin_secure_token') return next();
res.status(403).send('无管理员权限');
});
// 下面两个接口都会自动走上面的权限校验
app.get('/admin/dashboard', (req, res) => res.send('管理后台'));
app.get('/admin/users', (req, res) => res.send('用户列表'));
```
实际开发中,我们很少手写所有中间件,Express 内置了很多常用中间件,还有大量第三方中间件可以直接通过 `use` 注册使用,这也是 Express 生态高效的原因。最常见的比如用来托管静态资源的 `express.static`,用来解析 JSON 请求体的 `express.json`,还有处理跨域的第三方中间件 `cors`。比如要给所有接口开启跨域、解析 JSON 请求体,同时托管 `public` 目录的静态文件,只需要三行代码:
```javascript
const cors = require('cors');
app.use(cors()); // 全局开启跨域
app.use(express.json()); // 解析JSON格式请求体
app.use('/static', express.static('public')); // 托管静态资源
```
`app.use()` 还有一个特殊用法,就是注册错误处理中间件。和普通中间件不同,错误处理中间件的回调函数必须接收四个参数:`err`、`req`、`res`、`next`,Express 会根据参数数量识别错误处理中间件。这类中间件必须注册在所有普通中间件和路由之后,当前面的逻辑调用 `next(err)` 抛出错误时,请求会直接跳过后续普通中间件,进入错误处理中间件统一处理,避免每个路由都重复写错误逻辑。
使用 `express.use` 最需要注意的就是注册顺序,中间件会严格按照代码中注册的先后顺序执行。比如如果把权限校验中间件放在 `/admin` 路由之后,那请求会先进入路由返回响应,权限校验就完全失效了;再比如如果把 `express.json()` 放在需要解析请求体的路由之后,路由里就拿不到 `req.body` 的数据。
`express.use` 是 Express 中间件体系的核心入口,小到日志打印、请求解析,大到权限管控、错误兜底,都可以通过 `use` 灵活组合。理解了 `use` 的匹配规则、执行顺序和参数约定,就相当于掌握了 Express 开发的核心逻辑,后续开发复杂接口或排查请求流程问题都会轻松很多。(全文约962字)
本文由作者笔名:优维 于 2026-09-12 09:15:01发表在本站,原创文章,禁止转载,文章内容仅供娱乐参考,不能盲信。
本文链接: http://www.nxvc.vip/wen/5547.html