Npm 安装期间“无法读取未定义的属性‘匹配’”

Posted

技术标签:

【中文标题】Npm 安装期间“无法读取未定义的属性‘匹配’”【英文标题】:"Cannot read property 'match' of undefined" during Npm install 【发布时间】:2020-02-12 17:13:18 【问题描述】:

我在构建 Jenkins 时遇到错误

詹金斯日志

任务:api:processResources 任务:api:类 任务:web:nodeSetup 任务:web:npmSetup /var/lib/jenkins/workspace/hds_v2_docker/web/.gradle/npm/npm-v6.11.2/bin/npm -> /var/lib/jenkins/workspace/hds_v2_docker/web/.gradle/npm/npm-v6.11.2/lib/node_modules/npm/bin/npm-cli.js /var/lib/jenkins/workspace/hds_v2_docker/web/.gradle/npm/npm-v6.11.2/bin/npx -> /var/lib/jenkins/workspace/hds_v2_docker/web/.gradle/npm/npm-v6.11.2/lib/node_modules/npm/bin/npx-cli.js

npm@6.11.2 在 6.837 秒内添加了来自 832 个贡献者的 430 个包

任务 :web:npmInstall FAILED npm ERR!无法读取未定义的属性“匹配”

npm 错误!可以在以下位置找到此运行的完整日志:npm ERR! /var/lib/jenkins/.npm/_logs/2019-10-16T01_11_20_594Z-debug.log

FAILURE:构建失败并出现异常。

出了什么问题:任务 ':web:npmInstall' 执行失败。

进程'命令'/var/lib/jenkins/workspace/hds_v2_docker/web/.gradle/npm/npm-v6.11.2/bin/npm'' 以非零退出值 1 结束

尝试:使用 --stacktrace 选项运行以获取堆栈跟踪。使用 --info 或 --debug 选项运行以获得更多日志输出。运行 --scan 以获得完整的见解。

通过https://help.gradle.org获得更多帮助

此版本中使用了已弃用的 Gradle 功能,使其 与 Gradle 6.0 不兼容。使用 '--warning-mode all' 显示 个别弃用警告。看 https://docs.gradle.org/5.0/userguide/command_line_interface.html#sec:command_line_warnings

33 秒后构建失败

/var/lib/jenkins/.npm/_logs/2019-10-16T01_11_20_594Z-debug.log

17 silly saveTree   │ ├─┬ clean-css@4.2.1
17 silly saveTree   │ │ └── source-map@0.6.1
17 silly saveTree   │ ├── commander@2.17.1
17 silly saveTree   │ └── he@1.2.0
17 silly saveTree   └─┬ loader-utils@0.2.17
17 silly saveTree     ├── big.js@3.2.0
17 silly saveTree     ├── emojis-list@2.1.0
17 silly saveTree     └── json5@0.5.1
18 verbose stack TypeError: Cannot read property 'match' of undefined
18 verbose stack     at tarballToVersion (/usr/local/lib/node_modules/npm/lib/install/inflate-shrinkwrap.js:87:20)
18 verbose stack     at inflatableChild (/usr/local/lib/node_modules/npm/lib/install/inflate-shrinkwrap.js:99:22)
18 verbose stack     at BB.each (/usr/local/lib/node_modules/npm/lib/install/inflate-shrinkwrap.js:55:12)
18 verbose stack     at tryCatcher (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/util.js:16:23)
18 verbose stack     at Object.gotValue (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/reduce.js:155:18)
18 verbose stack     at Object.gotAccum (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/reduce.js:144:25)
18 verbose stack     at Object.tryCatcher (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/util.js:16:23)
18 verbose stack     at Promise._settlePromiseFromHandler (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/promise.js:512:31)
18 verbose stack     at Promise._settlePromise (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/promise.js:569:18)
18 verbose stack     at Promise._settlePromiseCtx (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/promise.js:606:10)
18 verbose stack     at _drainQueueStep (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/async.js:142:12)
18 verbose stack     at _drainQueue (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/async.js:131:9)
18 verbose stack     at Async._drainQueues (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/async.js:147:5)
18 verbose stack     at Immediate.Async.drainQueues (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/async.js:17:14)
18 verbose stack     at runCallback (timers.js:810:20)
18 verbose stack     at tryOnImmediate (timers.js:768:5)
19 verbose cwd /var/lib/jenkins/workspace/hds_v2_docker/web
20 verbose Linux 4.4.0-59-generic
21 verbose argv "/usr/bin/node" "/usr/local/bin/npm" "install"
22 verbose node v8.16.0
23 verbose npm  v6.9.0
24 error Cannot read property 'match' of undefined
25 verbose exit [ 1, true ]

【问题讨论】:

【参考方案1】:

尝试删除您的 package-lock.json 看看是否有帮助。

rm -rf package-lock.json 

编辑:如果问题仍然存在,请同时删除 node_modules

rm -rf node_modules

【讨论】:

感谢您的回答。我已经尝试过,但我遇到了同样的错误 也尝试删除 node_modules。 rm -rf node_modules 进入你的应用程序目录后。 在 Windows 操作系统上使用 del package-lock.json 命令。同时关闭编辑器并删除node_modules。两者都是必须的。 这只是一个临时解决方案。我相信根据问题作者提供的输入提供一个永久解决问题的解决方案会很棒【参考方案2】:

您必须删除 both package-lock.json node_modules/

如果您不删除两者,问题将在下一个npm install 再次出现。

【讨论】:

这应该是公认的答案。问题是为什么会这样? package-lock.json 对我来说已经足够了 =) 这对我有用,错误消息类似 (Cannot read property 'extraneous' of undefined)。【参考方案3】:

在我的仓库中运行 npm install 时遇到了同样的错误。我不使用 Jenkins,但我发现了一种在 NPM 中调试(并最终解决)此问题的通用方法。

    打开 cli 为您提供的 npm 调试日志文件。 (在 Windows 上,默认在 C:\Users\USERNAME\AppData\Roaming\npm-cache\_logs 下) 在文件底部查找错误的堆栈跟踪。 错误堆栈跟踪的前三行应类似于:
18 verbose stack TypeError: Cannot read property 'match' of undefined
18 verbose stack     at tarballToVersion (C:\Users\USERNAME\AppData\Roaming\nvm\v14.5.0\node_modules\npm\lib\install\inflate-shrinkwrap.js:87:20)
18 verbose stack     at inflatableChild (C:\Users\USERNAME\AppData\Roaming\nvm\v14.5.0\node_modules\npm\lib\install\inflate-shrinkwrap.js:113:22)
    打开inflate-shrinkwrap.js 文件,然后转到上面堆栈跟踪行#3 中列出的行。 添加这个调试代码:(就在调用tarballToVersion的[in stack-trace]行之前)
if (sw.version == null) 
    console.error(`
        NPM is trying to retrieve package "$name" with version "undefined"!
        Package location: $(onDiskChild || ).location
        Package parse error:`, (onDiskChild || ).error);

    运行npm install(或任何产生错误的命令)。您应该会看到如下输出:
        NPM is trying to retrieve package with version "undefined"!
        Package location: /firebase-feedback/webpack-dev-middleware
        Package parse error: [Error: ENOENT: no such file or directory, open 'C:\Root\Apps\@V\@Modules\firebase-feedback\Main\node_modules\webpack-dev-middleware\package.json'] 
  errno: -4058,
  code: 'ENOENT',
  syscall: 'open',
  path: 'C:\\Root\\Apps\\@V\\@Modules\\firebase-feedback\\Main\\node_modules\\webpack-dev-middleware\\package.json'

    转到内部错误中指定的路径。您应该会发现该路径下的 package.json 文件确实丢失了。 按照您认为合适的方式解决潜在的“package.json”问题。 (对我来说,这是通过删除 C:/Root/Apps/@V/@Modules/firebase-feedback/Main/node_modules 文件夹,然后在 Main 文件夹中运行 npm install

请注意,在我的情况下,潜在问题(缺少 package.json 文件)似乎是由于我不小心从父项目(使用我的 firebase-feedback 库)运行 npm install 引起的,而我有该库“npm 链接”。

我通常使用npm-safe-install 来避免这类问题(使用npm link 时),但我最近一定忘记了——导致NPM 破坏了npm 链接库的node_modules 文件夹。

npm link 相关的类似问题以前也发生过,但我希望 NPM 现在已经修复了这些问题。显然不是;虽然 NPM 的第 7 版有 been stated 将在该区域进行重写,所以希望这将长期解决它。

【讨论】:

【参考方案4】:

您必须删除项目 Package-lock.json 文件。然后尝试安装你想要的。

【讨论】:

不,不应该。这是“推荐的解决方法”,但在实践中却令人难以置信。在 package.json 中锁定依赖项并不能确保依赖项的依赖项保持一致,因此删除 package-lock.json 文件、安装 npm 并生成 newlock 文件*将允许这些子依赖项发生更改,这通常会完全更改打破任何未来的建筑。使用现有的锁定文件通常是维护构建的唯一方法(毕竟这是文件的 POINT),因此完全删除它会违背其存在的原因。【参考方案5】:

该错误可能因可以抛出的 npm 内部文件而异! (我想知道所有可能的原因)!它应该是一个错误!

(在我的最后一种情况下:它在 npm 的文件 build-ideal-tree.js[_canPlaceDep] 方法上!

注意

如果常用方法都不起作用!而且您正在使用 nodejs v15+最新的 npm 版本之一!进入最后一部分!我称之为 nodejs VERSIONS HELL 的问题! (注意:经过反思!对于 npm,它可能不是一个版本!请阅读了解)

如何尝试解决

删除节点模块

\rm -r node_modules

之后重新安装

npm install

(注意:这可能仍然不起作用)

您也可以尝试删除 package.lock!

清除缓存

npm cache clean --force

如果缓存以某种方式损坏,这可以工作!但是常见的错误更多的是Unexpected end of JSON input while parsing near ...

你可以在这里查看我的答案(解释得很好):https://***.com/a/52249619/7668448

删除 package.lock(不建议这样做)

rm package.lock

为什么不建议

来自@DanielIM 评论

不,不应该。这是“推荐的解决方法”,但在实践中却令人难以置信。在 package.json 中锁定依赖项并不能确保依赖项的依赖项保持一致,因此删除 package-lock.json 文件、安装 npm 并生成 newlock 文件*将允许这些子依赖项发生更改,这通常会完全更改打破任何未来的建筑。使用现有的锁定文件通常是维护构建的唯一方法(毕竟这是文件的 POINT),因此完全删除它会违背其存在的原因。

所以通常把它作为最后的手段是很好的!如果它不起作用!您也可以尝试删除 node_modules

重新安装 nodejs 或 NPM

问题可能发生在 npm 级别!尝试重新安装可能是一个不错的方法!

快速测试代替重新安装!使用NVM(nodejs 版本管理器)并切换到另一个版本既快速又有趣!因为我们也可以测试VERSION HELL PROBLEM

如果切换后有效!然后要么是 npm 的问题,重新安装可能会解决它!或者它是一个版本地狱问题(一个错误)!

如何快速重新安装!再次使用 nvm!

nvm uninstall v15

然后

nvm install v15

那就用吧

nvm use v15

您可以安装另一个版本并使用它! (例如 v14)

查看VERSION HELL问题以及如何使用nvm在版本之间切换!

不常见的或新的!版本地狱

今年!我遇到了很多 nodejs VERSIONS HELL 问题! (我喜欢这样称呼他们)(因为我给他们起了名字!天空在祝福我更多)(讽刺)

快速列出它们:

Node v14 HELL (POSTGRES) 并导致 pg 模块 (postgres) 出现问题 [因为重大更改!该 pg 取决于!](如果您使用 knex 或任何 orm 或查询构建器!并将它与 postgres 一起使用!你会遇到它的机会很大!如果你只是单独升级 nodejs 版本![解决方案:将pg versoin升级到最新(>=8.0.3)[他们做了修复](可以在这里查看完整的详细说明https://***.com/a/64639717/7668448)] Typescript v4 地狱!类似的问题!我的一个项目中的打字稿在内部因cannot read property "" of undefined 而失败!回滚到 v3.9 运行成功!没问题!

解决我们的问题 (Cannot read property 'matches' of undefined)

如果您使用的是 node v15!试试 node v14 (npm v6.14.8)!可能就是这样!一个 npm 错误!这是第一个想法可以!我一开始就是这么想的!

我就是这样!最后一个问题!我尝试了所有我熟悉的解决方案!他们也已经在这里列出了!没有工作!当我删除 node_modules 时,还有更多!我是Please not another version HELL是的就是这样!它与**node v14** (npm v6.14.8) 配合得很好。这暗示了一个 [BUG]。

那就稍微反思一下吧!就像嘿!当我改变版本!我正在使用另一个 nodejs 安装!这不可能有问题。 npm 结构或其他问题并重新安装可能会解决它(如上所述)!

之后!我试过node v15.3.0。一切正常!安装之后就OK了!我回到节点 v15.0.1!它再次起作用了!所以问题是绝对不是 VERSION HELL 问题

我仍然无法解释到底发生了什么!但总之!使用 NVM!换个版本试试!是个好办法!您也可以快速重新安装当前版本!

Big Takedown(适用于 VERSION HELL)

从 nodejs v14 开始!和 v15!或者只是一般!很高兴对版本持怀疑态度!更多的原因是它没有意义!这就是所有问题,而不仅仅是 npm!有这么多VERSIONS HELL问题!到现在我遇到了2个!收到VERSIONS HELL警报可以为您节省大量时间!

如何快速测试并快速切换nodejs版本

要快速测试和检查!主要针对将要发生的任何内部错误!我会快速谷歌一下!并且尝试其他版本的 nodejs任何有问题的东西(例如:打字稿)!我也可以调试(console.log)引发错误的内部文件!并尝试弄清楚一些事情!

但就是这样! 检查其他版本真的很有趣! (nodejs, typescript, ... [记住要持怀疑态度或警惕])

对于nodejs来说要快点:

NVM 快速切换 nodejs 版本(npm)

使用NVM(nvm是node.js的版本管理器,)

在NVM中快速安装版本

nvm install v14

快速切换到其他节点版本

nvm use v14

(查看文档了解详细信息!以及安装过程)

用于切换和测试一些 npm 模块版本(例如:typescript)

如果它是一个 cli 工具!您可以在全球范围内安装精确的版本

npm i -g typescript@3.9

使用@ 语法!

验证和测试后,您可以切换回您喜欢的任何内容!

如果它在一个项目中!你也可以这样做(不是全局的)!使用@ 语法来精确版本!

npm i moduleName@<versionSpecifier>

或保存

npm i moduleName@<versionSpecifier> --save

版本说明符使用 SEMVER 约定 (https://semver.org/)。

最后提示(在脚本中使用 npx)

为项目设置一个内部版本真是太好了!例如

"devDependencies": 
    "@types/cors": "^2.8.6",
    "@types/gulp": "^4.0.6",
    "cross-env": "^6.0.3",
    "glob": "^7.1.6",
    "gulp": "^4.0.2",
    "nodemon": "^2.0.4",
    "ts-node": "^8.10.2",
    "typescript": "^3.9.7", // <===== Typescript version 3.9 (for this project)
    "jest": "^26.6.3"
  

在脚本中我使用 npx:

"scripts": 
    "build": "npx tsc && gulp build",

当我们通过 nodjes 模块 cli 工具以这种方式使用 npx 时! npx 将首先检查该模块是否在本地 node_modules 中可用!如果找到将使用它(否则使用全局,或下载最新版本并运行)!

所以按照我的建议去做!将确保您的项目独立于您在全球范围内的任何项目运行!

(如果您不太了解该工具,请阅读有关 npx 的更多信息)

【讨论】:

【参考方案6】:

以下步骤对我有用 -

    从 ../AppData/Roaming 中删除 npm 和 npm catch 文件夹 为here安装最新的节点js。 根据您的存储库重试所有步骤。

【讨论】:

以上是关于Npm 安装期间“无法读取未定义的属性‘匹配’”的主要内容,如果未能解决你的问题,请参考以下文章

无法读取未定义错误的属性“匹配”

错误类型错误:无法读取未定义的属性“匹配”

Vue路由器错误:TypeError:无法读取未定义的属性“匹配”

ionic native http get return typeError - 无法读取未定义的属性“匹配”

TypeError:使用来自 react-router 的 useParams 时无法读取未定义的属性“匹配”

JavaScript 短路评估错误?