gpt4 book ai didi

node.js - 重构 Mongoose 查询

转载 作者:太空宇宙 更新时间:2023-11-03 22:37:25 24 4
gpt4 key购买 nike

我一直在使用 Mongoose ,但我似乎无法绕过“回调 hell ”并通过错误处理污染我的查询。

例如,这是我的路线:

var homePage = function(req, res) {
var companyUrl = buildingId = req.params.company

db.pmModel
.findOne({ companyUrl: companyUrl })
.exec(function (err, doc) {
if (err)
return HandleError(req, res, err)

if( !doc )
return NoResult(req, res, {msg: 'Aint there'})

console.log(doc)

db.rentalModel
.find({ propertyManager: doc.id })
.populate('building')
.exec(function (err, rentals) {
if (err)
return HandleError(req, res, err)

if( !doc )
return NoResult(req, res, {msg: 'Aint there'})

console.log(doc)

var data = doc.toJSON()

data.rentals = rentals

res.render('homePage', data)
})
})
}

我的问题:有没有更简洁的写法?

最佳答案

所以也许你上面的只是一个小例子,但在我看来,你的代码中并没有太多“回调 hell ”(在我看来)。但是,您当然可以重构您的代码。只是要知道,这样做会使从维护的角度来看更难以理解或遵循。

您可以做的一件事就是重构您的数据库层。如果您总是发现自己查询一个集合,然后右转并查询另一个集合,则可以考虑合并这些集合,或者至少合并您正在查找的文档。在关系数据库中,您可以分离这些表并进行合并,但是在基于文档的数据库中,有时组合每个文档中的数据更有意义。这使得您的代码中的查询和逻辑更简单。

另一个解决方案是将调用重构为单独的函数,并以不同的方式控制流程。一个可以帮助解决此问题的流行库是 async它提供了许多辅助函数来协助 JavaScript 的异步世界。有很多可供选择,但一个建议是使用 waterfall函数适合您的情况(因为每个调用必须在下一个调用之前进行)。然后它看起来像这样:

async.waterfall([
function(callback){
findCompany(companyUrl, callback);
},
function(id, callback){
findPropertyManager(id, callback);
}
], function (err, rentals) {
res.render(rentals)
});

您仍然需要处理每个函数中的错误,但您甚至可以将其重构为辅助函数。此外,您可以选择自己编写一些代码来帮助控制流程,而不是使用异步。

但是,上面显示的代码是可以理解和可读的,并且只包含几个内联回调。通过这种方式,可以减少很多事情,并且可以使以后的调试(如果出现问题)变得更容易。

关于node.js - 重构 Mongoose 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24522714/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com