在node.js中的Restify模块中正确返回next()的位置?

时间:2015-06-07 22:35:02

标签: javascript node.js nonblocking restify

以下是从数据库查询用户的示例,如果用户存在,则另一个查询电话:

module.exports = function (username, req, res, next) {

    var query = User.where('username', new RegExp('^' + username + '$', 'i'));
    query.findOne(function (err, user) {
        if (err) {
            res.send("error");
            //## position D
        } else if (!user) {
            res.send("user not found");
            //## position D
        } else {
            //user exists
            //search for phone
            var query2 = Phone.where('phone', new RegExp('^' + user.phone + '$', 'i'));
            query2.findOne(function (err, phone) {
                if (err) {
                    res.send("error");
                    //## position D
                } else if (!phone) {
                    res.send("phone not found");
                    //## position D
                } else {
                    res.send(phone);
                    //## position D
                }
                //## position C
            });
        }
        //## position B
    });
    //## position A
}

我的问题是:基于此代码,设置的正确位置在哪里 返回next(); ?为什么?

我提出了一些建议:

  • 位置A:@函数的底部。在这里它甚至会被称为 早于查询数据库中的数据

  • 位置B:@第一回调函数的底部

  • 位置C:@最后一个回调函数的底部

  • 位置D:立即在res.send(..)之后

P.S:我知道我可以将错误作为对象传递到下一个..我只是想让代码变得简单,专注于主要问题。

感谢yokefellows,'。

1 个答案:

答案 0 :(得分:1)

绝对是位置D,但你可以拥有一些东西"更清洁"回调。

module.exports = function (username, req, res, next) {

    var query = User.where('username', new RegExp('^' + username + '$', 'i'));
    query.findOne(function (err, user) {
        if (err) {
            return next(err);
        }
        if (!user) {
          res.send("user not found");
          return next();
        }
        //user exists
        //search for phone
        var query2 = Phone.where('phone', new RegExp('^' + user.phone + '$', 'i'));
        query2.findOne(function (err, phone) {
            if (err) {
                return next(err);
            }
            if (!phone) {
                res.send("phone not found");
            } else {
                res.send(phone);
            }
            next();
        });
    });
}