为何需在调用app.listen(3000)前编写app.get路由处理函数?
为什么Express中通常把app.listen放在路由处理代码之后?
避免请求丢失的风险:Node.js是单线程事件循环,所以你先调用
app.listen再写路由,代码确实能正常运行,但如果路由注册依赖异步操作(比如从数据库读取路由配置、读取文件后生成路由),先启动服务器的话,在异步操作完成前,服务器已经在接收请求,这部分请求会因为路由还没注册而返回404。把listen放在所有路由之后,能确保所有路由(包括异步加载的)都配置完成后,再对外提供服务,不会出现这种请求丢失的情况。符合逻辑顺序,可读性更强:从逻辑上来说,得先把应用的所有配置(路由、中间件、全局处理逻辑)都准备好,再启动服务器对外提供服务。其他开发者看代码时,顺着从上到下的顺序,能清晰看到服务器启动前的所有配置,一眼就能搞懂应用的结构,维护起来更方便。
规避极端场景下的异常:如果你的路由注册前有大量同步阻塞代码(比如复杂的计算、大文件同步读取),先启动服务器的话,服务器会在阻塞期间接收请求,但因为路由还没注册完成,无法处理这些请求。把
listen放在最后,能保证所有同步配置都做完再启动服务器,减少这种异常情况的影响。
举个异步路由的反例就清楚了:
const express = require("express"); const app = express(); // 先启动服务器 app.listen(3000); // 2秒后才注册路由 setTimeout(() => { app.get("/", (req, res) => { res.send("Hello"); }); }, 2000);
服务器启动后的前2秒内访问http://localhost:3000,会直接返回404,因为路由还没注册好。但如果把
app.listen移到setTimeout代码块之后,就不会出现这个问题。
内容的提问来源于stack exchange,提问作者Rajat Srivastava
相关产品推荐
相关产品推荐

