1️⃣ Express 核心概念
概念 说明 示例
应用程序实例 express() 创建,用于配置和启动服务器 const app = express()
路由 定义端点(URL + HTTP 方法)的处理逻辑 app.get('/users', handler)
中间件 请求-响应周期中执行的函数,可修改 req/res 或结束请求 app.use(logger)
静态资源托管 将指定目录下的文件对外开放访问 app.use(express.static('public'))
请求对象 (req) 包含请求信息(参数、body、查询字符串等) req.query、req.params、req.body
响应对象 (res) 用于向客户端发送响应 res.send()、res.json()、res.status()
2️⃣ 路由详解
javascript
// 基本路由
app.get('/users', (req, res) => { ... })
app.post('/users', (req, res) => { ... })
app.put('/users/:id', (req, res) => { ... })
app.delete('/users/:id', (req, res) => { ... })
// 路由参数
app.get('/users/:userId/books/:bookId', (req, res) => {
const { userId, bookId } = req.params
})
// 查询字符串
app.get('/search', (req, res) => {
const { q, page } = req.query // /search?q=node&page=2
})
// 路由模块化(express.Router)
const userRouter = require('./routes/user')
app.use('/api/users', userRouter)
3️⃣ 中间件分类
类型 作用范围 语法 典型应用
全局中间件 所有请求 app.use(middleware) 日志、CORS、静态托管
局部中间件 特定路由 app.get('/path', mw1, mw2, handler) 特定接口的鉴权、验证
内置中间件 Express 自带 express.json()、express.urlencoded()、express.static() 解析 JSON、表单、托管静态文件
第三方中间件 通过 npm 安装 app.use(cors())、app.use(morgan()) 跨域、日志、压缩、限流
错误处理中间件 捕获错误 app.use((err, req, res, next) => {}) 统一错误响应、记录日志
中间件执行流程:
text
请求 → 全局中间件1 → 全局中间件2 → 路由匹配 → 局部中间件 → 路由处理 → 响应
↓ (报错)
错误处理中间件 → 响应
4️⃣ 你实现的自定义 Body 解析中间件(核心逻辑)
javascript
function myBodyParser(req, res, next) {
let data = ''
req.on('data', chunk => {
data += chunk
})
req.on('end', () => {
const contentType = req.headers['content-type']
if (contentType === 'application/json') {
try {
req.body = JSON.parse(data) // 直接用 JSON.parse
} catch (e) {
req.body = {}
}
} else if (contentType === 'application/x-www-form-urlencoded') {
req.body = querystring.parse(data) // 或 new URLSearchParams(data)
} else {
req.body = data
}
next()
})
}
app.use(myBodyParser)
关键点:
流式接收数据(data 事件可能多次触发)
根据 Content-Type 选择解析方式
解析结果挂载到 req.body
必须调用 next() 才能继续后续中间件/路由
5️⃣ 错误处理中间件(标准写法)
javascript
// 放在所有路由之后,app.listen 之前
app.use((err, req, res, next) => {
console.error(err.stack)
res.status(500).json({
error: err.message || '服务器内部错误'
})
})
Express 框架
创建应用
- const app = express()
- app.listen(port, callback)
路由 (Routing)
- HTTP 方法: get, post, put, delete
- 路径: 字符串、字符串模式、正则
- 参数
- req.params (/users/:id)
- req.query (?name=xxx)
- 路由模块化
- express.Router()
- app.use('/prefix', router)
中间件 (Middleware)
- 特点
- 按顺序执行
- 必须调用 next() 或 res.end()
- 分类
- 全局: app.use(fn)
- 局部: app.get('/path', fn, handler)
- 内置: express.json(), express.urlencoded(), express.static()
- 第三方: cors, morgan, helmet
- 错误处理: (err, req, res, next) => {}
- 请求周期
- 请求 → 中间件链 → 路由 → 响应
- 错误 → 错误中间件
请求对象 (req)
javascript
- req.params // 路由参数
- req.query // 查询字符串
- req.body // 请求体 (需中间件)
- req.headers // 请求头
- req.method // HTTP 方法
- req.url // 原始 URL
响应对象 (res)
javascript
- res.send() // 自动设置 Content-Type
- res.json() // 返回 JSON
- res.status() // 设置状态码
- res.sendFile() // 发送文件
- res.redirect() // 重定向
- res.download() // 下载文件
静态资源托管
- app.use(express.static('public'))
- 访问 http://localhost/img/1.png
自定义中间件示例
- 解析 body (监听 data/end)
- 日志记录
- 权限校验