从失败的功能返回

时间:2016-12-31 09:20:11

标签: javascript node.js

我正在用节点js编写我的后端,因为我对节点及其异步性质相当新,我需要澄清一下。我想要实现的是在验证失败时从中间件函数返回。我能够通过在每个条件之后使用return;来做到这一点,但是这样我必须为我拥有的每个条件设置res对象的一些值。例如:

if(recvToken) {
    try {
      let tokenVal = jwt.decode(recvToken, app.get('jwtToken'));
      if(tokenVal.exp < Date.now()) {
        res.status(401).json({
          success: false,
          message: 'Auth failed',
          details: 'Some other details'
          // And a few more fields
        });
      }
      else if(tokenVal.mode !== 'cust') {
        res.status(401).json({
          success: false,
          message: 'Auth failed',
          details: 'Some other details'
          // And a few more fields
        });
      }
      else {
        // A few more conditions, you get the gist
      }
    }
    catch (err) {
      return;
    }
  }
  else {
    return;
  }

这很有效。但是我希望有一个能够为我处理所有这些故障的功能。我搞砸了一下,最后得到了一些东西:

function handleFailure(res, cb) {
  res.status(401).json({
    message: 'Not authorized'
  });
  cb();
}

从所有条件代码中调用,例如:

if(tokenVal.mode !== 'cust') {
  handleFailure(res, function() { return; });
}
else if(tokenVal.exp < Date.now()) {
  handleFailure(res, function() { return; });
}

当然它看起来更干净,但它不起作用,因为回调函数的返回从回调函数而不是父函数返回。 我可以做什么从调用handleFailure的函数返回?提前谢谢!

2 个答案:

答案 0 :(得分:1)

一个简单的解决方案是使 handleFailure 不需要回调。

function handleFailure(res) {
  res.status(401).json({
    message: 'Not authorized'
  });
}

// Somewhere else in the code
if(tokenVal.mode !== 'cust') {
  handleFailure(res);
  return;
}
else if(tokenVal.exp < Date.now()) {
  handleFailure(res);
  return;
}

答案 1 :(得分:0)

您可以返回handleFailure函数,因此当前函数的执行结束,同时您正在处理失败(发回401响应)。

function handleFailure(res) {
  res.status(401).json({
    message: 'Not authorized'
  });
}

if(tokenVal.mode !== 'cust') {
  return handleFailure(res);
}
else if(tokenVal.exp < Date.now()) {
  return handleFailure(res);
}