express的中间件
Express 中间件通常被描述为“洋葱圈模型”(Onion Model)。这个模型是用来形象化描述中间件的执行顺序和生命周期的。
在 Express 中,中间件是按顺序执行的,并且可以有两种类型的执行路径:
- 请求阶段(Request Phase):请求从外到内穿过中间件栈,直到到达路由处理函数或其他中间件。
- 响应阶段(Response Phase):响应会从内到外穿过中间件栈,直到返回给客户端。
假设中间件的执行顺序像洋葱的层次结构一样,每一层都是一个中间件。
- 最外层的“皮”:表示请求到达的第一个中间件。每个中间件可以决定是否将控制权传递给下一个中间件,或者结束请求处理流程。
- 内层的“层次”:每个中间件都可以对请求对象 (
req
) 和响应对象 (res
) 进行修改。 - 内层的最中心:通常是路由处理函数,它会处理特定的请求,然后将响应返回给客户端。
当请求进入时,它按顺序进入每个中间件,直到达到路由处理函数或结束请求流程。然后,在响应阶段,Express 会按相反的顺序通过这些中间件,最终将响应返回给客户端。
const express = require('express'); const app = express(); // 第一个中间件 app.use((req, res, next) => { console.log('First Middleware'); next(); // 将请求传递给下一个中间件 }); // 第二个中间件 app.use((req, res, next) => { console.log('Second Middleware'); next(); // 将请求传递给下一个中间件 }); // 路由处理函数 app.get('/', (req, res) => { res.send('Hello, World!'); }); // 第三个中间件 app.use((req, res, next) => { console.log('Third Middleware'); next(); // 你可以选择不调用 next() 来结束请求 }); app.listen(3000, () => { console.log('Server is running on port 3000'); });
如何结束请求?
使用 res.send()
或 res.json()
app.use((req, res, next) => { // 发送响应并结束请求 res.send('Request has been handled'); // 后续的中间件和路由将不会再执行 });