Node.js 重构mongoose查询 我一直在使用猫鼬作为一个考虑量,我似乎不能绕过“地狱”,用错误处理来污染我的查询。

Node.js 重构mongoose查询 我一直在使用猫鼬作为一个考虑量,我似乎不能绕过“地狱”,用错误处理来污染我的查询。,node.js,mongoose,Node.js,Mongoose,例如,我有一条路线: var homePage = function(req, res) { var companyUrl = buildingId = req.params.company db.pmModel .findOne({ companyUrl: companyUrl }) .exec(function (err, doc) { if (err)

例如,我有一条路线:

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

我的问题:有没有一种更简洁的方法来写这个呢?

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

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

另一个解决方案是将调用重构为单独的函数,并以不同的方式控制流。一个常用的库可以帮助实现这一点,它提供了许多帮助函数来帮助JavaScript的异步世界。有很多可供选择,但一个建议是根据您的情况使用该函数(因为每个调用必须在下一个调用之前进行)。然后它会像这样:

async.waterfall([
    function(callback){
        findCompany(companyUrl, callback);
    },
    function(id, callback){
        findPropertyManager(id, callback);
    }
], function (err, rentals) {
   res.render(rentals)
});
您仍然需要处理每个函数中的错误,但您甚至可以将其重构为一个helper函数。此外,您可以选择自己编写代码来帮助控制流,而不是使用异步


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

我应该发布更大的示例,哈哈,我正试图避开这样的情况,在这种情况下,我需要使用5个模型,而不是上面的2个。这就是它变得痛苦的地方。@delboud我可以理解:)那么上面的内容仍然适用——您可以合并文档(如果可能),或者使用类似async的东西来更好地管理代码流。然后将逻辑重构为单独的函数,每个函数负责mongo查询,并导致调用回调时出现错误或结果。