Node.js 猫鼬的承诺和承诺
我喜欢async await语法,我经常在mongoose中使用它 因此,在我的项目中有很多: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的异步代码已经运行到完成。有什么事吗 除了一个承诺,没有什么可以
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()