根本原因是Windows未将node.exe路径加入PATH环境变量,需手动添加C:\Program Files\nodejs\及npm全局bin路径(如%APPDATA%\npm\node_modules.bin)到系统Path,并重启终端验证。

node -v 命令报错:不是内部或外部命令
根本原因是 Windows 没把 node.exe 所在路径加进系统 PATH 环境变量。哪怕安装时勾选了 “Add to PATH”,某些杀毒软件、组策略或旧版安装器仍可能跳过这步。
- 打开命令行,执行
where node—— 如果返回空,说明系统完全找不到node.exe - 手动定位:通常在
C:\Program Files\nodejs\或C:\Users\{用户名}\AppData\Roaming\nvm\(若用了 nvm) - 把该路径复制下来,进入「系统属性 → 高级 → 环境变量」→ 在「系统变量」中找到
Path→ 点击「编辑」→ 「新建」→ 粘贴路径 → 保存 - 重启所有已打开的终端(包括 VS Code 内置终端),再试
node -v
别信“重装一遍就行”——重装不解决 PATH 漏写问题,反而可能叠加多个重复路径,导致后续 npm 找包混乱。
npm install -g express 后,全局命令 express 仍不可用
这不是 Express 安装失败,而是 npm 全局模块的 bin 目录没进 PATH。LTS 版 Node.js 默认把全局包装到 %APPDATA%\npm(Windows)或 ~/npm(macOS/Linux),这个路径和 node.exe 不在同一个目录下,必须单独添加。
- 先查真实路径:终端运行
npm config get prefix,输出就是全局安装根目录 - Windows 下,该路径下的
node_modules\.bin才是全局可执行文件所在位置,例如:%APPDATA%\npm\node_modules\.bin - 把这个
.bin路径追加进系统Path变量(不是 prefix 根目录!) - 验证:关闭所有终端,新开一个,运行
express --version
很多人卡在这里,是因为只加了 prefix 路径,却忽略了 .bin 子目录 —— 这是 npm 的设计,不是 bug。
VS Code 调试时断点不命中,或提示“无法连接到目标”
VS Code 自带 Node.js 调试器,但默认不启用源码映射(source map)支持,也不自动识别 package.json 中的 type: "module"。常见于 ESM 项目或用了 TypeScript/Babel 编译的场景。
- 检查当前文件是否被识别为 CommonJS:在 VS Code 底部状态栏看右下角,显示 “JavaScript (CommonJS)” 才能直接调试;若显示 “JavaScript (ES Module)”,需额外配置
- 对 ESM 项目,在
.vscode/launch.json中显式指定运行时参数:"runtimeArgs": ["--loader", "ts-node/esm"](TypeScript)或去掉"type": "module"临时切回 CommonJS 测试 - 确保 launch.json 中的
"program"指向的是实际入口文件(如"${workspaceFolder}/src/index.ts"),而不是编译后的dist/目录 - 禁用所有非必要扩展(尤其是老旧的 “Node Debug” 插件),VS Code 1.80+ 已原生支持 Node.js 20+ 的 ESM 调试,第三方插件反而干扰
断点失效往往不是环境没配好,而是 VS Code 没按你预期的方式加载代码 —— 它只认 launch.json 里写的路径和参数,不猜你的构建意图。
ESLint + Prettier 冲突:保存后格式被反复重写
两者定位不同:ESLint 检查逻辑与风格,Prettier 只管格式。冲突根源在于 ESLint 的 prettier 插件未正确禁用其自带的格式规则,导致两个工具互相覆盖。
- 必须安装
eslint-config-prettier,并在.eslintrc.js的extends数组末尾加上"prettier" - VS Code 设置里关掉
eslint.format.enable(设为false),让 Prettier 独占格式化职责 -
.prettierrc中避免写 ESLint 已覆盖的规则(如semi、quotes),否则容易形成“保存 → Prettier 改 → ESLint 报错 → 自动修 → 再改”的死循环 - 推荐组合:ESLint(含
eslint-plugin-import、@typescript-eslint)做质量检查,Prettier 做格式统一,分工明确才稳定
格式化冲突表面是配置问题,本质是没厘清工具边界 —— 把 Prettier 当成 ESLint 的子集来用,迟早踩坑。


















