Skip to content

参考:Express API、中间件清单与 4/5 对照速查

基于 Express 5.0 / 4.x · 核于 2026-08

速查

  • 核心 APIexpress() 建 app、app.use(path?, fn) 挂中间件、app.METHOD(path, ...handlers) 注册路由、app.listen(port) 启动、express.Router() 建子路由。
  • req 对象req.params(路径参数)、req.query(查询串,5.0 默认普通对象)、req.body(需 body-parser 中间件)、req.headersreq.cookies(需 cookie-parser)。
  • res 对象res.status(code)res.json(obj)res.send(data)res.end()res.redirect(url)res.set(field, value)res.cookie(name, value)
  • 中间件四类:应用级(app.use)、路由级(router.use)、错误处理(4 参数 (err,req,res,next))、内建(express.static/json/urlencoded)。
  • 路由参数:id(命名)、*splat(5.0 命名通配)、正则 /^\/users\/(\d+)$/
  • Express 5 关键变化:async 自动捕获、req.query 普通对象、废弃 API 移除、path-to-regexp v8、Node ≥ 18。
  • 错误处理next(err) 触发错误中间件,4.x async 需手动 try/catch,5.x 自动。
  • 必装中间件corshelmetmorganmultercookie-parsercompressionpassport

一、app 对象核心方法

方法说明示例
express()创建应用const app = express()
app.use([path,] fn)挂中间件app.use(cors()) / app.use('/api', auth)
app.METHOD(path, ...handlers)注册路由app.get('/users/:id', getUser)
app.all(path, ...handlers)所有方法app.all('*', logAll)
app.listen(port, cb)启动监听app.listen(3000)
app.set(key, value)配置项app.set('json spaces', 2)
app.engine(ext, fn)注册模板引擎app.engine('ejs', ejs.renderFile)
app.render(view, locals, cb)渲染视图SSR 场景

二、req 对象常用属性

属性说明4.x vs 5.0
req.params路径参数(/users/:id{id}一致
req.query查询串4.x qs 嵌套;5.0 普通对象
req.body请求体(需中间件解析)一致
req.headers请求头一致
req.cookiesCookie(需 cookie-parser)一致
req.path路径一致
req.method方法一致
req.ip客户端 IP(受 trust proxy 影响)一致

三、res 对象常用方法

方法说明是否终结响应
res.status(code)设置状态码否(链式)
res.set(field, value)设置响应头
res.json(obj)发 JSON
res.send(data)发数据(自动判断类型)
res.end()结束响应(无 body)
res.redirect([code,] url)重定向
res.cookie(name, value, opts)设置 Cookie
res.clearCookie(name)清除 Cookie
res.download(path)下载文件
res.render(view, locals)SSR 渲染

四、中间件四类

类型签名挂载方式用途
应用级(req, res, next) => {}app.use(fn)全局预处理(日志/CORS/body)
路由级同上router.use(fn)app.get(path, fn, h)特定路由预处理(鉴权/限流)
错误处理(err, req, res, next) => {}(必须 4 参数)app.use(fn) 在最后兜底错误,返回 500
内建express.static/json/urlencodedapp.use(express.json())静态文件/body 解析
  • 错误中间件必须是 4 参数:Express 靠 fn.length === 4 识别错误处理器——写成 3 参数会被当成普通中间件,永远收不到错误。
  • express.json() / express.urlencoded():4.16 起内建(取代独立的 body-parser),分别解析 JSON body 和表单 body。

五、Express 4.x vs 5.0 对照

维度Express 4.xExpress 5.0
发布2014-042024-10(等 9 年)
async 错误手动 try/catch + next(err),rejection 丢失自动捕获,rejection → next(err)
req.queryqs 库嵌套解析普通对象(可配置回 qs)
废弃 APIres.send(status)/app.del/req.param() 尚在全部移除
path-to-regexpv0.xv8(命名通配 *splat
Node 版本≥ 0.10≥ 18
中间件兼容大部分 4.x 中间件多数兼容,依赖废弃 API 的需更新

六、必装中间件清单

中间件作用周下载量级
cors跨域资源共享数千万
helmet安全头(CSP/XSS/HSTS 等)数千万
morganHTTP 请求日志数千万
multermultipart/form-data 文件上传数千万
cookie-parser解析 Cookie 头数千万
compressiongzip/deflate 压缩响应数千万
express-rate-limitAPI 限流数千万
passport认证策略(JWT/OAuth/Local)数千万
express-validator请求参数校验数千万

七、易错点清单

  • 错误中间件写成 3 参数:错。必须是 4 参数 (err, req, res, next),否则 Express 不认它是错误处理器。
  • 中间件忘了 next():请求挂起,客户端超时。记得每个中间件要么 res.send() 终结,要么 next() 放行。
  • 4.x async 抛错丢失:4.x 不会自动 next(err),async 处理器必须 try/catch 或用 express-async-errors。5.0 已修复。
  • 5.0 req.query 行为变了:依赖 ?a[b]=1 嵌套的代码升级会 break,需 app.set('query parser', 'extended') 或改代码。
  • 5.0 通配 * 改了:未命名 * 被移除,需命名 *splatreq.params.splat)。
  • express.json() 要在路由前挂app.use(express.json()) 必须在 app.post(...) 之前,否则 req.body 是 undefined。
  • app.listen 异步回调里的错误:端口被占用等错误在回调里,记得处理 app.listen(port, () => ...).on('error', ...)
  • 静态文件中间件顺序app.use(express.static('public')) 通常放最前,避免被日志/CORS 中间件拖慢静态资源。

八、进阶方向(链接其他叶)

  • Fastify —— Schema 验证 + 性能派,对比基准
  • Hono —— 边缘优先 + 跨运行时派
  • NestJS(如有) —— 基于 Express/Fastify 的企业级框架

权威链接