没有结果的异步查找会挂起app

时间:2015-02-01 19:29:53

标签: javascript node.js mongodb asynchronous

我试图在异步中使用mongoose,大多数情况下一切正常......但是当我执行不返回结果的查找时,我的应用程序似乎挂起并最终超时。

下面是一些示例控制器代码,使用mongoose和async执行简单的id查找:

module.exports.find = function(req, res) {
    async.waterfall([
        function(next) {
            SomeModel.findById(req.params.id, next);
        },
        function(someModel, next) {
            if (!SomeModel) {
                res.status(404).json({
                    success: false,
                    message: 'SomeModel not found'
                });
            } else {
                res.json(SomeModel);
            }
        }
    ]);
};

如果找到记录,一切都会恢复正常,但对于不存在的id,似乎永远不会调用第二个异步步骤,最终整个请求超时。

那我在这里做错了什么?我怎样才能获得“发现”这样的信息。打电话的方法' next'即使没有找到记录?

1 个答案:

答案 0 :(得分:0)

猫鼬正在抛出一个错误,你并没有抓住它。我应该提到的另一件事是你应该在最后的回调中做你的响应处理(你还没有定义)。

尝试这样的事情:

module.exports.find = function(req, res) {
    async.waterfall([
        function(next) {
            SomeModel.findById(req.params.id, next);
        }
    ], function(err, SomeModel){
        // this is the final callback

        if (err) {
            // put error handling here 
            console.log(err)
        }

        if (!SomeModel) {
            res.status(404).json({
                success: false,
                message: 'SomeModel not found'
            });

        } else {
            res.json(SomeModel);
        }

    });
};

或者,您可以简化它以不使用瀑布:

module.exports.find = function(req, res) {
    SomeModel.findById(req.params.id, function(err, SomeModel){
        if (err) {
            // put error handling here 
            console.log(err)
        }

        if (!SomeModel) {
            res.status(404).json({
                success: false,
                message: 'SomeModel not found'
            });

        } else {
            res.json(SomeModel);
        }

    });
};