ESLint consistent-return 和嵌套回调

ESLint consistent-return and nested callbacks

我在使用 ESLint 提供的 consistent-return 规则时遇到了一些问题。下面的代码将为 User.findOne 回调函数抛出 consistent-return 警告。据我所知,如果没有 findErr 并且有 existingUser.

,我只能 运行 .remove 操作

避免这些嵌套回调的最佳做法是什么?我想通过 consistent-return 警告,但网上还没有真正看到任何解决方案。

function remove(req, res) {
  User.findOne({ username: req.params.username }, (findErr, existingUser) => {
    if (findErr) return res.status(500).send(errorHandler.getErrorMessage(findErr));
    if (!existingUser) return res.status(404).send({ message: 'User not found' });

    existingUser.remove((removeErr) => {
      if (removeErr) return res.status(500).send(errorHandler.getErrorMessage(removeErr));

      return res.json({ message: `${existingUser.username} successfully deleted` });
    });
  });
}

What would be the best practice for avoiding these nested callbacks?

承诺。

I would like to pass the consistent-return warning

那你最好不要用early-returns。相反,写

function remove(req, res) {
  User.findOne({ username: req.params.username }, (findErr, existingUser) => {
    if (findErr) res.status(500).send(errorHandler.getErrorMessage(findErr));
    else if (!existingUser) res.status(404).send({ message: 'User not found' });

    else existingUser.remove((removeErr) => {
      if (removeErr) res.status(500).send(errorHandler.getErrorMessage(removeErr));

      else res.json({ message: `${existingUser.username} successfully deleted` });
    });
  });
}

或者,您应该可以做到

function remove(req, res) {
  User.findOne({ username: req.params.username }, (findErr, existingUser) => {
    if (findErr) {
      res.status(500).send(errorHandler.getErrorMessage(findErr));
      return;
    }
    if (!existingUser) {
      res.status(404).send({ message: 'User not found' });
      return;
    }
    existingUser.remove((removeErr) => {
      if (removeErr) {
        res.status(500).send(errorHandler.getErrorMessage(removeErr));
        return;
      }
      res.json({ message: `${existingUser.username} successfully deleted` });
    });
  });
}

您也可以启用 { "treatUndefinedAsUnspecified": true } 选项并使用 return void …