我怎样才能以更优雅的方式验证这一点?
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.`,
});
}
我正在尝试在我的项目中执行 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.`,
});
}