我怎样才能以更优雅的方式验证这一点?

How can I validate this in more elegant way?

我正在尝试在我的项目中执行 login/register 模块。这是我的登录功能。我希望有一个函数可以为我验证所有事情,这样我就不必使用那么多“if”语句。我试图用纯函数来做,但完全不知道该怎么做。有人可以帮助我吗?

const loginUser = async (req, res, next) => {
  const { password, email } = req.body;

  if (!email) {
    return res.status(400).json({
      message: "Error: Email cannot be blank.",
    });
  }
  if (!password) {
    return res.status(400).json({
      message: "Error: Password cannot be blank.",
    });
  }

  try {
    const user = await User.findOne({ email: email });

    if (!user)
      return res.status(400).json({
        message: "Invalid user",
      });

    if (!validPassword(password, user.password))
      return res.status(400).json({
        message: "Invalid password",
      });

    const { name, likedArr, _id } = user;
    const token = crypto.randomBytes(32).toString("hex");
    const userSession = new UserSession({ userId: _id, token });
    await userSession.save();
    return res.status(200).json({
      message: "Valid login",
      token: token,
      user: {
        name,
        likedArr,
        userId: _id,
      },
    });
  } catch (err) {
    next(err);
  }
};

将我的评论抽象为答案。

关于纯函数:

如果我正确理解纯函数,我不认为你可以有一个调用外部 API 的纯函数,这可能会失败,因为相同的输入可能 return 不同的结果取决于关于 API 的外部状态(除非 API 以某种方式保证其自身是纯粹的)。 (Definition of a pure function)

关于重复:

我真的认为你在这里没有太多重复。您的代码很清晰,只有 4 个条件,所有这些都是您需要测试的。您可以根据条件将 JSON return 的相似之处抽象为模板字符串之类的东西,但我认为 可能 会增加您的混乱和不透明代码,如果你做得太多,这不是一个好的 trade-off。

如果你想要我在这里的意思的例子:

if (!email) {
  return res.status(400).json({
    message: "Error: Email cannot be blank.",
  });
}
if (!password) {
  return res.status(400).json({
    message: "Error: Password cannot be blank.",
  });
}

可以成为...

if (!email || !password) {
  return res.status(400).json({
    message: `Error: ${!email ? 'Email' : 'Password'} cannot be blank.`,
  });
}