为何Express中间件顺序至关重要?与React的差异解析
Express中间件顺序影响功能的原理解析
问题重现
我第一次用Express开发时,因为中间件顺序不对卡了整整2小时。之前用React时顺序不影响功能,但这段代码一直报错:
const app = express(); app.use('/auth',userRouter); app.use(express.json());
把顺序改成下面这样就正常了:
const app = express(); app.use(express.json()); app.use('/auth',userRouter);
期间我还试过用bodyParser,以为是express.json()本身有问题:
app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true }));
核心原理
- Express中间件按注册顺序执行:当HTTP请求进来时,Express会严格按照
app.use()(或路由注册)的先后顺序,依次匹配并执行中间件。只要某一个中间件处理完请求并返回响应,后续中间件就不会再执行。 express.json()的作用:这个中间件负责解析请求体中的JSON格式数据,把解析后的结果挂载到req.body对象上。如果请求没经过它处理,req.body会是undefined——这就是之前报错的直接原因。- 错误顺序的问题所在:先注册
/auth路由后,所有发往/auth的请求会直接进入userRouter处理,但此时express.json()还没运行。路由里的代码如果要读取req.body里的参数,自然会因为req.body是undefined而抛出错误。 - 正确顺序的逻辑:先注册
express.json(),所有请求都会先经过它完成JSON解析,等请求流到userRouter时,req.body已经有了解析好的数据,路由代码就能正常使用这些参数了。 - 关于
bodyParser的补充:从Express 4.16.0版本开始,express.json()就是bodyParser.json()的内置封装,两者功能完全一致,所以换bodyParser解决不了问题,核心还是中间件的顺序。
内容的提问来源于stack exchange,提问作者AKSHAY RAI
相关产品推荐
相关产品推荐

