【发布时间】: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