Node.js 回调地狱,如果/否则调用其他回调

Node.js 回调地狱,如果/否则调用其他回调,node.js,Node.js,我有一个这样的函数: MngService.getByKey(service, function(service) { if (service === null) return res.json(STATUS_ERROR); MngUser.login(login, pass, function(user) { if (user === null) return res.json(STATUS_ERROR); MngToken.replaceTokenForService

我有一个这样的函数:

MngService.getByKey(service, function(service) {
  if (service === null) return res.json(STATUS_ERROR);
  MngUser.login(login, pass, function(user) {
    if (user === null) return res.json(STATUS_ERROR);
    MngToken.replaceTokenForServiceIdAndUserId(service.id, user.id, function(token) {
      if (!token) return res.json(STATUS_ERROR);
      return res.json(STATUS_SUCCESS);
    });
  });
});
我想根据if/else测试更改我的
MngUser.login
函数。 目前我找到的唯一解决方案是:

var loginFunc;
if (something)
{
  loginFunc = function (login, pass, token, cb) {
    return MngUser.loginWithPassword(login, pass, cb);
  };
}
else {
  loginFunc = function (login, pass, token, cb) {
    return MngUser.loginWithToken(token, cb);
  };
}

MngService.getByKey(service, function(service) {
  if (service === null) return res.json(STATUS_ERROR);
  loginFunc(login, pass, token, function(user) {
    if (user === null) return res.json(STATUS_ERROR);
    MngToken.setSsoTokenForUserId(user.id, function(sso_token) {
      if (!token) return res.json(STATUS_ERROR);
      return res.json(STATUS_SUCCESS);
    });
  });
});

我想知道这样做是否好,或者在Node.JS中是否有更好的设计模式来处理这种情况,因为我发现它有点难读并且容易出错

登录、传递和令牌来自哪里?似乎您有一些范围正在进行,您可能应该首先清除它。它们是在同一请求中从客户端发送的post参数。在这种情况下,我觉得您应该有不同的路由器(或同一路由器中的不同回调)处理不同的登录方法。i、 e.
/login/creds
用于用户:密码,
/login/token
用于令牌等。如果我有不同的路由器,问题是逻辑重复多次(通过密钥获取服务,更新令牌,还有其他我删掉的内容)在这种情况下,您可以创建一个函数,该函数接受登录函数并返回路由函数<代码>函数loginRoute(loginFn){return function(){/*在此处使用loginFn*/};}然后转到
express.post('/token',loginRoute(myTokenFunc));快递邮寄('/creds',登录路线(myCredentialsLoginFunc))登录、通行证和令牌从哪里来?似乎您有一些范围正在进行,您可能应该首先清除它。它们是在同一请求中从客户端发送的post参数。在这种情况下,我觉得您应该有不同的路由器(或同一路由器中的不同回调)处理不同的登录方法。i、 e.
/login/creds
用于用户:密码,
/login/token
用于令牌等。如果我有不同的路由器,问题是逻辑重复多次(通过密钥获取服务,更新令牌,还有其他我删掉的内容)在这种情况下,您可以创建一个函数,该函数接受登录函数并返回路由函数<代码>函数loginRoute(loginFn){return function(){/*在此处使用loginFn*/};}
然后转到
express.post('/token',loginRoute(myTokenFunc));快递邮寄('/creds',登录路线(myCredentialsLoginFunc))