重构猫鼬查询

用户名

我一直在使用猫鼬,但我似乎无法绕过“回调地狱”,并使用错误处理来污染我的查询。

例如,这是我的路线:

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)
                    })
            })
    } 

我的问题是:有没有更简洁的方式写这个?

助剂

因此,也许您上面的内容只是一个小例子,但在我看来,您的代码中并没有发生太多“回调地狱”(我认为)。但是,您当然可以重构代码。只是知道这样做,从维护的角度来看,您可能会更难以理解或遵循。

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

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

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

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

但是同样,您在上面显示的代码是可以理解和阅读的,并且仅包含几个内联回调。这样,可以减少很多事情,并且可能使以后的调试(如果出现问题)更加容易。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章