Node.js 猫鼬的承诺和承诺

Node.js 猫鼬的承诺和承诺,node.js,mongodb,mongoose,promise,sonarqube,Node.js,Mongodb,Mongoose,Promise,Sonarqube,我喜欢async await语法,我经常在mongoose中使用它 因此,在我的项目中有很多: const user = await User.findOne({ _id: req.params.id }) 这和预期的一样。但是,在sonarqube中,我有以下错误: 重构这个多余的“等待”的非承诺。 第一条规则是: 可以在不是承诺的价值观上使用wait,但它是 无用的和误导性的。等待的要点是暂停执行,直到 Promise的异步代码已经运行到完成。有什么事吗 除了一个承诺,没有什么可以

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

因此,在我的项目中有很多:

const user = await User.findOne({
    _id: req.params.id
})
这和预期的一样。但是,在sonarqube中,我有以下错误:
重构这个多余的“等待”的非承诺。

第一条规则是:

可以在不是承诺的价值观上使用wait,但它是 无用的和误导性的。等待的要点是暂停执行,直到 Promise的异步代码已经运行到完成。有什么事吗 除了一个承诺,没有什么可以等待的

当等待的价值被保证不是承诺时,这条规则会引发一个问题

不遵从代码示例

兼容解决方案

我使用的是Mongo4.0和mongoose 5.3.1


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

正如评论中提到的,这是一个误报,更准确地说是一个无摩擦的警告

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

mongoose.Promise = Promise; 

我对SonarQube不太了解。我刚刚发现,
sonaqube
是一个检查代码质量的工具,它需要
wait
只带有
承诺的前缀,而且
猫鼬
甚至没有
。然后

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

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

问题可能在于sonarqube如何键入查询类型。但是,从mongoose自己的文档中,它们是
.then()
可启用的,并且符合
async/wait
的要求,因此您可能会得到误报。不确定。但是在上面的查询中使用
.exec
,看看会发生什么。
const user=wait user.findOne({u id:req.params.id}).exec()
因为mongoose查询不是完全的承诺,
.exec
帮助实现真正的承诺。@Fanpark顺便说一句,您的解决方案解决了我的问题,所以如果您介意将其作为答案发布,我将接受它
mongoose.Promise = Promise; 
const user = await User.findOne({ _id: req.params.id }).exec()