node.js - 重构 Mongoose 查询

标签 node.js mongoose

我一直在使用 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/

相关文章:

javascript - 内部架构方法范围 "this"在 Mongoose 4.4.12 中为空 {}

node.js - 在 Mocha 中使用 Supertest 测试 Node.js Express API 和 MongoDB

node.js - 如何在 Mongoose 中声明集合名称和模型名称

javascript - 如何同时保存两个相互关联的模型?

javascript - 在 node.js 中设置下载响应的文件名

javascript - 如何使用下划线js从对象数组中查找字符串?

angularjs - Liferay7.0 portlet build with angular and typescript

javascript - Mongoose 填充值并修改对象

javascript - 有没有办法使用 MySQL 函数从 Lat、Lng 获取 POINT 坐标?

javascript - 使用 express node.js 的 Route 但 express.Router 变得未定义