NPM CI 和 Bluebird 承诺警告

Posted

技术标签:

【中文标题】NPM CI 和 Bluebird 承诺警告【英文标题】:NPM CI and Bluebird promise warnings 【发布时间】:2019-06-10 13:43:08 【问题描述】:

简短介绍:我们开始使用 npm ci 来为我们的 react 应用程序安装更可靠的依赖项,而不是 install。但是我们在使用ci 时注意到了一些奇怪的promise 拒绝行为。


说明: 当在 NODE_ENV 设置为 development 的节点环境中运行 npm ci 时,我们会收到来自 Bluebird Promise 库的数百条 Promise 警告:

(node:95984) Warning: .then() only accepts functions but was passed: [object Object]

我很好奇这些是否来自 npm CI 的代码本身,因为除了使用 npm CI 时,我们从未见过这些错误。

您还可以在 their source code 中看到 NPM 正在使用 Bluebird Promise 库版本 3.5.3

为了测试这一点,我逐步删除了 package.json 中的所有 main 和 dev 依赖项,生成锁定文件并运行 npm ci 以查看它是否源自任何特定的包,但它每次都会发生最后一个包(和备用的单个包)。

我还创建了一个完全独立的 npm 存储库并安装了一个包 (react-scripts@latest),生成了一个锁定文件,并在运行 npm ci 时收到了相同的承诺警告。

我们能够通过设置环境变量 BLUEBIRD_PROMISES=0 根据此 npm issue 的建议来消除构建错误,而这确实消除了警告。但我们想知道为什么会发生这种情况,以及这些警告背后是否有什么比简单地让它们沉默更值得关注的东西。

版本信息: npm:6.4.1 节点:10.15.0

【问题讨论】:

【参考方案1】:

我完全错过了这个(差不多一岁的)问题:]

但我们想知道为什么会这样,

Bluebird 有一个警告功能,它会警告不正确地使用承诺。 NPM 内部使用 bluebird,而 NPM 在其自己的代码库中的某些地方使用不正确。

特定的warning 发生在您.then 具有可能是错误的非功能时。

如果这些警告背后有一些东西值得更多关注,而不是简单地让它们沉默。

您通常可以使用环境变量使它们静音或安全地忽略它们。

【讨论】:

以上是关于NPM CI 和 Bluebird 承诺警告的主要内容,如果未能解决你的问题,请参考以下文章

承诺已创建,但未从中返回

bluebird的安装配置

Node.js 承诺和异步异常

Google Cloud Functions - 警告避免嵌套承诺承诺/不嵌套

未处理的承诺警告。如何解决?

未处理的承诺拒绝警告(Cordova Angular)