【问题标题】:Where to put return next() properly in Restify module in node.js?在 node.js 的 Restify 模块中正确放置 return next() 的位置?
【发布时间】:2015-06-08 07:16:11
【问题描述】:

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

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
}

我的问题是:根据这段代码,正确的设置位置在哪里 返回下一个(); ?为什么?

我提出了一些建议:

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

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

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

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

P.S:我知道我可以将错误作为对象传递到 next.. 我只是想简化代码以专注于主要问题。

谢谢yokefellows,'。

【问题讨论】:

  • 如果您发送回复,您根本不需要使用next
  • 在 Restify Doc 中:"您负责调用 next() 以运行链中的下一个处理程序。如下所示,您可以传入一个 Error 对象以使 restify 自动返回响应到客户。” mcavage.me/node-restify ... 所以建议使用 res.send .. 但是在哪里?
  • 啊,好的,谢谢你的链接。我原以为只有在您想继续链条时才需要它,但如果您想短路,似乎也需要致电next(false)。可能 restify 需要做一些清理工作。

标签: javascript node.js nonblocking restify


【解决方案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();
        });
    });
}

【讨论】:

  • 谢谢..您的代码是正确的..我只是习惯于使用 return 来防止跌倒,例如在调用 next 后我再次使用 res.send 或 next 这将是一个痛苦的问题.但是D ..我同意你的看法..我只是想确定
猜你喜欢
  • 2013-01-11
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多