猫鼬承诺和声纳

Posted

技术标签:

【中文标题】猫鼬承诺和声纳【英文标题】: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 您的解决方案解决了我的问题,所以如果您介意将其发布为答案,我会接受它 【参考方案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; 

【讨论】:

以上是关于猫鼬承诺和声纳的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬承诺文档说查询不是承诺?

猫鼬承诺与蓝鸟和打字稿

猫鼬承诺错误

猫鼬模型保存后返回承诺

猫鼬静态方法返回一个蓝鸟承诺

链接猫鼬承诺的语法