npm 在 Windows 终端中无法工作。

3
我目前已经通过winget安装了最新版本的NodeJS(v19.9.0)。在Git Bash中使用它完全没有问题,但是如果我尝试通过PowerShell或Windows Terminal使用它,则node命令可以正常工作,但尝试使用npm将导致以下错误:
node:internal/modules/cjs/loader:1093
  throw err;
  ^

Error: Cannot find module 'C:\Program Files\nodejs\node_modules\npm\bin\node_modules\npm\bin\npm-cli.js'
    at Module._resolveFilename (node:internal/modules/cjs/loader:1090:15)
    at Module._load (node:internal/modules/cjs/loader:934:27)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:83:12)
    at node:internal/main/run_main_module:23:47 {
  code: 'MODULE_NOT_FOUND',
  requireStack: []
}

Node.js v19.9.0
node:internal/modules/cjs/loader:1093
  throw err;
  ^

Error: Cannot find module 'C:\Program Files\nodejs\node_modules\npm\bin\node_modules\npm\bin\npm-cli.js'
    at Module._resolveFilename (node:internal/modules/cjs/loader:1090:15)
    at Module._load (node:internal/modules/cjs/loader:934:27)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:83:12)
    at node:internal/main/run_main_module:23:47 {
  code: 'MODULE_NOT_FOUND',
  requireStack: []
}

Node.js v19.9.0

我已经尝试通过官方网站可下载的方式重新安装了Node,并重新安装了Windows终端/Powershell。 我还删除了临时文件,并确保路径环境变量配置正确。


错误表示代码正在寻找一个主模块。请参见:https://mathieularose.com/main-function-in-node-js?force_isolation=true - jdweng
错误提示表明代码正在寻找一个主模块。请参阅:https://mathieularose.com/main-function-in-node-js?force_isolation=true - jdweng
1
文件 C:\Program Files\nodejs\node_modules\npm\bin\node_modules\npm\bin\npm-cli.js 是否真的不存在(以排除错误是误导性的)?目录路径 C:\Program Files\nodejs 是否与 (Get-Command node).Path 报告的 node.exe 安装位置一致? - mklement0
@mklement0 看起来路径是错误的。node.exe确实在C:\Program Files\nodejs路径下,但是引用的npm-cli.js只是在C:\Program Files\nodejs\node_modules\npm\bin下。然而,这个路径是SysEnv PATH的一部分。我能改变npm查找这个文件的位置吗? - Szabó Áron
1个回答

2

简而言之

通过注册表(运行sysdm.cpl,转到高级选项卡,然后单击环境变量...)从持久的Path环境变量定义中删除以下目录,或以其他方式确保它不会成为您的PowerShell会话中$env:Path的一部分:

C:\Program Files\nodejs\node_modules\npm\bin

只有 C:\Program Files\nodejs 应该在 $env:Path 中,其中包含适当的 CLI 入口点 npm.cmd,以及 Node.JS 可执行文件 node.exe


多个npm.cmd文件存在于C:\Program Files\nodejs的子目录中,它们都会在一个相对于自身的位置寻找npm-cli.jsnpm.js

C:\Program Files\nodejs\node.cmdC:\Program Files\nodejs\node_modules\npm\bin\node.cmd相同的,并使用以下路径查找实际的.js入口点npm-cli.js,该入口点通过node.exe启动:

SET "NPM_CLI_JS=%~dp0\node_modules\npm\bin\npm-cli.js"

也就是说,在与 npm.cmd 相同的目录中,会在子文件夹 .\node_modules\npm\bin 中查找 npm-cli.js
对于 C:\Program Files\nodejs\node_modules\npm\bin\node.cmd,这仅适用于C:\Program Files\nodejs\node.cmd,它最终会查找
C:\Program Files\nodejs\node_modules\npm\bin\node_modules\npm\bin\npm-cli.js - 请注意重复的 node_modules\npm\bin 部分 - 该文件不存在。
在您的情况下,错误的 C:\Program Files\nodejs\node_modules\npm\bin 条目显然在正确的 C:\Program Files\nodejs 条目之前,因此当使用 npm(或 npm.cmd)调用命令时,将执行错误的 npm.cmd 批处理文件。
删除错误的条目应该可以解决该问题。
通常情况下,当你使用一个简单的文件名(如npm)时,如果调用了错误的可执行文件,可以使用Get-Command命令,并加上-All开关来显示所有这样的可执行文件,按优先顺序排列:列表中的第一个是有效的;例如:
# Print the full paths of all "npm" executables located in directories
# listed in $env:Path; the first one "wins".
Get-Command npm -All | ForEach-Object Path

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接