猫鼬承诺和声纳

L. *_*ros 4 mongoose mongodb node.js promise sonarqube

我喜欢 async await 语法,并且我经常将它与 mongoose 一起使用。

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

const user = await User.findOne({
    _id: req.params.id
})
Run Code Online (Sandbox Code Playgroud)

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

和声纳规则 i :

可以对不是 Promises 的值使用 await,但它是无用且具有误导性的。await 的目的是暂停执行,直到 Promise 的异步代码运行完成。除了 Promise 之外,没有什么可等待的。

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

不合规的代码示例

let x = 42;
await x; // Noncompliant
Run Code Online (Sandbox Code Playgroud)

合规解决方案

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

let y = p ? 42 : new Promise(resolve => resolve(42));
await y;
Run Code Online (Sandbox Code Playgroud)

我正在使用 mongo 4.0 和 mongoose 5.3.1

由于我可以使用.then,.catch语法,我认为我正在处理 promise,所以我该如何解决?

Ash*_*shh 7

我不太了解SonarQube。我只是想出了SonarQube为工具来检查代码质量,并得到它所需的await只是前缀的promises,有mongoose失败,甚至有.then

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

const user = await User.findOne({ _id: req.params.id }).exec()
Run Code Online (Sandbox Code Playgroud)