断点未生效主因是未命中真实渲染路径:模板可能被缓存(如 consolidate cache 或 require.cache)、加载了错误路径(如 dist 而非 src)、中间件提前终止响应,或调试未 attach 到实际执行的子进程。

断点加了但模板没刷新,先确认是否命中真实渲染路径
很多“缓存失效”问题其实不是缓存没清,而是断点根本没落在实际执行的模板逻辑里——比如你改了 src/views/user.ejs,但服务运行时加载的是 dist/views/user.ejs 或从内存缓存(如 consolidate 的 cache 选项)直接返回旧内容。
- 在模板引擎初始化处(如
app.set('view engine', 'ejs')后)打个断点,检查res.render()调用前,options.cache是否为false(开发时必须关) - 对 Express/Koa,检查中间件顺序:如果
res.render()前有res.send()、next()被提前终止,或用了res.redirect(),断点自然跳过 - 用
console.log(require.resolve('ejs'))确认加载的是你预期的模块路径,避免本地node_modules/ejs和全局/monorepo 中版本混用
launch.json 配置必须绕过构建缓存和 require.cache
默认 program 指向 index.js 时,Node 会复用 require.cache 里的已编译模块,导致你改了模板文件、重启调试后仍走旧逻辑。这不是断点问题,是模块加载机制本身在“作弊”。
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
- 在
launch.json的env字段中强制清空缓存:"env": {"NODE_OPTIONS": "--no-warnings"}不够,要加"env": {"NODE_OPTIONS": "--no-warnings --experimental-loader ./clear-require-cache.mjs"} - 更简单可靠的做法:在
program入口文件顶部手动插入require('module')._cache = {};(仅开发用),或调用delete require.cache[require.resolve('./views/user.ejs')]; - 若用 Webpack/Vite 构建 SSR,确保
outFiles指向构建产物目录(如"./dist/views/**/*.ejs"),否则 VS Code 根本不尝试映射源码
异步模板渲染里断点跳过?优先用 debugger; + await 断点
像 EJS、Nunjucks 这类模板引擎在 render() 内部大量使用 Promise 或回调,单纯在 res.render('user', data) 行下断点,VS Code 往往停在 node:internal 底层,看不到变量;而等它跳进模板函数体,又可能因异步调度错过上下文。
- 在模板文件第一行写
debugger;(注意不是注释),比点击行号更可控——只要 Node 进程带--inspect启动,就一定触发 - 在
res.render()调用前加await new Promise(r => setTimeout(r, 0));,制造微任务边界,让 F11 “Step Into” 能真正进入模板编译函数 - 禁用 V8 优化:
"runtimeArgs": ["--nolazy", "--no-opt"],防止内联或消除局部变量,否则locals、data在 Variables 面板里显示为undefined
多进程渲染(如 cluster)下子进程断点不生效
生产环境常用 cluster 启动多个 worker,但默认 VS Code 只 attach 主进程。你看到主进程日志里打印了 “Rendering user.ejs”,却在 worker 里断点无效——因为调试器根本没连上它。
- 在
launch.json中启用自动附加:"autoAttachChildProcesses": true(Node ≥ 14.18 支持) - 若用
pm2或自定义 fork,需改用request: "attach"+"port": 9229,并在每个 worker 启动时加--inspect=0.0.0.0:9229(Docker 内注意绑定地址) - 验证是否连上:打开 Debug Console,执行
process.pid,对比终端里ps aux | grep node输出的 PID —— 不一致说明你调试的是另一个进程
console.log 在关键节点输出 process.pid、require.resolve('xxx')、Object.keys(require.cache),把执行路径显式暴露出来。










