猫鼬承诺和声纳
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】:
我对@987654321@了解不多。我刚刚发现SonarQube
是检查代码质量的工具,它需要await
仅前缀为promises
,而mongoose
甚至无法使用.then
。
即使有 .then()
,Mongoose 查询也不会返回“完全成熟”的承诺。因此,为了获得“成熟”的承诺,您需要使用.exec()
函数。
const user = await User.findOne( _id: req.params.id ).exec()
【讨论】:
【参考方案2】:正如 cmets 中提到的,它是误报,更准确地说是被贬低的警告。
您可以忽略它,也可以在导入语句之后将其添加到您的代码中:
mongoose.Promise = Promise;
【讨论】:
以上是关于猫鼬承诺和声纳的主要内容,如果未能解决你的问题,请参考以下文章