【问题标题】:Mongoose promise and sonarqube猫鼬承诺和声纳
【发布时间】:2019-09-19 11:24:36
【问题描述】:

我喜欢 async await 语法,我在 mongoose 中经常使用它。

所以在我的项目中有很多:

const user = await User.findOne({
    _id: req.params.id
})

按预期工作。但是,在 sonarqube 中,我有以下错误: Refactor this redundant 'await' on a non-promise.

还有声纳规则我:

可以在不是 Promise 的值上使用 await,但它是 无用和误导。等待的重点是暂停执行,直到 Promise 的异步代码已经运行完成。随随便便 除了 Promise,没有什么可以等待的。

当等待的值保证不是 Promise 时,此规则会引发问题。

不合规代码示例

let x = 42;
await x; // Noncompliant

合规解决方案

let x = new Promise(resolve => resolve(42));
await x;

let y = p ? 42 : new Promise(resolve => resolve(42));
await y;

我正在使用 mongo 4.0 和 mongoose 5.3.1

因为我可以使用 .then, .catch 语法,所以我认为我正在处理承诺,那么我该如何解决呢?

【问题讨论】:

  • 问题可能在于 sonarqube 如何对查询类型进行鸭式输入。来自猫鼬自己的文档"Mongoose queries are not promises",但是它们是.then()able 并且符合async/await,因此您可能会得到误报。
  • 不确定。但是在上面的查询中使用.exec 看看会发生什么。const user = await User.findOne({ _id: req.params.id }).exec() 因为猫鼬查询不是成熟的承诺,.exec 有助于实现真正的承诺。
  • @Fanpark 您的解决方案解决了我的问题,所以如果您介意将其发布为答案,我会接受它

标签: node.js mongodb mongoose promise sonarqube


【解决方案1】:

我对@9​​87654321@了解不多。我刚刚发现SonarQube 是检查代码质量的工具,它需要await 仅前缀为promises,而mongoose 甚至无法使用.then

即使有 .then(),Mongoose 查询也不会返回“完全成熟”的承诺。因此,为了获得“成熟”的承诺,您需要使用.exec() 函数。

const user = await User.findOne({ _id: req.params.id }).exec()

【讨论】:

    【解决方案2】:

    正如 cmets 中提到的,它是误报,更准确地说是被贬低的警告。

    您可以忽略它,也可以在导入语句之后将其添加到您的代码中:

    mongoose.Promise = Promise; 
    

    【讨论】:

      猜你喜欢
      • 2015-05-12
      • 2012-12-14
      • 2015-10-27
      • 1970-01-01
      • 2017-06-15
      • 2019-06-04
      • 2017-08-18
      • 2018-02-15
      • 2014-03-27
      相关资源
      最近更新 更多