全球数百万个Node.js应用在处理请求时,都依赖同一套机制——中间件。它不像路由那样显眼,却决定了每个HTTP请求的命运。
上周我们完成了一个干净的用户资源REST API,定义了路由、处理了各种HTTP方法。今天我们要深入Express的核心:中间件(middleware)。如果你想记录每个请求、校验身份令牌、或在数据到达路由处理器前做验证,中间件就是答案。
![]()
中间件是Express中能够访问请求对象(req)、响应对象(res)以及应用中请求-响应周期内下一个中间件函数的函数。这个"下一个"函数通常命名为next。可以把中间件想象成一系列检查站,每个传入请求必须经过这些站点才能到达最终的路由处理器。在每个检查站,你可以执行代码、修改请求和响应对象、结束请求-响应周期,或者调用next()将控制权交给下一个中间件。
中间件函数按定义顺序执行,这个顺序至关重要。一个典型的Express应用中,HTTP请求流经这样的管道:请求 → [中间件1] → [中间件2] → [路由处理器] → 响应。每个箭头都是一次next()调用。如果某个中间件没有调用next(),请求就会卡住,永远无法到达下一个中间件或路由处理器——除非你发送响应并结束请求。
next函数是告诉Express"我完成了,继续下一个"的回调。如果当前执行的中间件没有结束请求-响应周期,就必须调用next()。这里有两个关键变体:调用next()进入下一个中间件;调用next(err)则跳过所有剩余的非错误中间件,直接进入错误处理中间件(后者有四个参数:err, req, res, next)。
应用级中间件通过app.use()或app.METHOD()绑定到应用实例。如果不指定路径,它们对每个请求都生效;如果指定了路径前缀,则只匹配该路径的请求。例如,这段代码为每个请求记录HTTP方法、URL和时间戳,然后调用next()让请求继续下行。
你也可以为特定路径挂载中间件。这种灵活性让Express的管道机制成为构建可复用、可组合后端逻辑的基础。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.