为何Express初始化时执行模块代码,路由回调仅在请求触发时执行?
为什么两个案例的日志执行时机有差异?
这是个很典型的模块加载与代码执行时机问题,核心原因在于Node.js的模块加载机制和不同代码块的执行触发条件不一样,咱们拆解来看:
1. Express路由回调的执行逻辑
在第一个Express案例里,console.log("Inside Router ")是写在application.get("/", ...)的回调函数内部的:
application.get("/", function( request: express.Request, response: express.Response ) { console.log("Inside Router "); // 这行在回调函数内 response.json({ "test": true}); });
Express的路由处理函数属于事件驱动的回调——只有当客户端发起GET /的HTTP请求,并且Express匹配到这个路由规则时,才会触发执行这个回调函数里的代码。所以这行日志只会在路由被访问时才会打印。
2. Wrapper模块的顶层代码执行逻辑
再看第二个案例里的wrapper.ts:
const methods = () => { }; console.log("This is a testable offence"); // 这行是模块顶层代码 export const wrapperMethod = {methods};
当你的启动代码里执行const wrapper = require('./wrapper')时,Node.js会立即加载这个模块,并且执行模块内所有的顶层代码——也就是那些不在任何函数、对象或类内部的代码。
这行console.log属于模块顶层代码,所以在服务器启动阶段(模块被加载的瞬间)就会被执行打印,和你有没有调用wrapper.methods()完全无关。而路由里的console.log("when")依然是回调函数,只有当GET /city的请求到达时才会触发,这和第一个案例的路由逻辑是一致的。
核心总结
- 模块顶层代码:在模块被
require/import时立即执行,不管你是否调用模块内的函数或对象。 - 回调函数(比如路由处理函数、
listen的回调):只有当对应的事件(HTTP请求、服务器启动完成)发生时,才会被触发执行。
内容的提问来源于stack exchange,提问作者Rajendra kumar Vankadari
相关产品推荐
相关产品推荐

