You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何需在调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:15:55