ExpressJS中createApplication()函数工作原理及app.handle调用疑问
Express源码分析疑问与调试问题解答
1. 刚定义的app函数为啥能调用app.handle?
你看到的app函数定义确实在handle方法挂载之前,但等这个app函数真正被执行的时候,handle方法已经被挂上了。
具体来说,createApplication里的流程是:
- 先声明
const app = function(req, res, next) { app.handle(req, res, next); },这时候app只是个空函数,确实没有handle方法 - 紧接着,Express会把
lib/application.js里定义的一堆原型方法(包括handle),通过原型链绑定到app上,比如源码里的这行:
(不同版本写法可能有差异,但核心都是把原型方法挂载到app.__proto__ = proto;app实例) - 当你在自己的代码里调用
express()得到app,再用app.listen()或者直接调用app(req, res)时,app已经具备了所有方法,包括handle,所以调用完全没问题。
本质是:函数定义时的app.handle是个引用,真正执行这个函数的时候,app已经被补全了方法。
2. VS Code调试Express源码断点被跳过怎么解决?
大概率是VS Code默认跳过了node_modules里的代码,或者源码没有正确映射,试试这几个办法:
- 改launch.json配置:
在项目的.vscode/launch.json里,把skipFiles设置成只跳过Node内部代码,别包含node_modules:{ "version": "0.2.0", "configurations": [ { "type": "node", "request": "launch", "name": "启动项目", "program": "${workspaceFolder}/你的入口文件.js", "skipFiles": ["<node_internals>/**"] } ] } - 用本地源码调试:
直接克隆Express的Git仓库到本地,然后在你的项目里用npm link把依赖换成本地的源码版本,这样就能直接在本地源码里打断点,不会被跳过。 - 检查source map:
有些npm上的Express包可能没带source map文件,导致调试器没法映射到源码。这种情况要么装带source map的版本,要么直接用Git仓库的代码。
内容的提问来源于stack exchange,提问作者Rushi Vaghasiya
相关产品推荐
相关产品推荐

