javascript - 优化用户创建中间件
问题描述
我正在开发一个 REST API 的项目,并希望对这个简单的用户创建中间件提供一些反馈。您将如何优化它以便没有这么多“if”语句?
这是代码:
function middlewareUserCreation(req, res, next) {
const conditionUserName = req.body.userName != null && req.body.userName != undefined;
const conditionFullName = req.body.fullName != null && req.body.fullName != undefined;
const conditionEmail = req.body.email != null && req.body.email != undefined;
const conditionTelephone = req.body.telephone != null && req.body.telephone != undefined;
const conditionAddress = req.body.address != null && req.body.address != undefined;
const conditionPassword = req.body.password != null && req.body.password != undefined;
if (conditionUserName) {
if (conditionFullName) {
if (conditionEmail) {
if (conditionTelephone) {
if (conditionAddress) {
if (conditionPassword) {
const newUserName = req.body.userName;
const newEmail = req.body.email;
const checkAdmin = req.body.isAdmin;
for (user of validUsersArray) {
if (newUserName != user.userName) {
if (newEmail != user.email) {
return next();
}
res.send("Email taken, please use another one");
}
}
res.send("Username taken, please try another one");
}
res.send("A password is required");
}
res.send("Please provide a delivery address");
}
res.send("A contact telephone is required");
}
res.send("An email is required");
}
res.send("Please provide your full name");
}
res.send("Choose an username");
};
解决方案
可能有许多较小的想法,例如使用!!
:
// this:
const conditionUserName = req.body.userName != null && req.body.userName != undefined;
// is the same as this:
const conditionUserName = !!req.body.userName;
片段显示这一点:
const long = (data) => {
return data != null && data != undefined
}
const short = (data) => {
return !!data
}
const arr = [
null,
undefined,
'has value',
]
arr.forEach(e => {
console.log("long:", long(e))
console.log("short:", short(e))
})
res.send
然后您可以提取规则,根据规则并根据验证结果创建验证函数:
const validationMessages = {
userName: "Choose a username",
fullName: "Please provide your full name",
email: "An email is required",
telephone: "A contact telephone is required",
address: "Please provide a delivery address",
password: "A password is required",
}
const validate = (messages, data) => {
// return the message if any of the keys are null or undefined (truthy)
// return false otherwise (falsy)
const msg = Object.keys(messages).find(key => !(!!data[key]))
return msg ? messages[msg] : false
}
function middlewareUserCreation(req, res, next) {
// if invalid it will be a message; if valid it will be undefined
const isInvalid = validate(validationMessages, req.body)
if (isInvalid) {
res.send(isInvalid)
} else {
const newUserName = req.body.userName;
const newEmail = req.body.email;
const checkAdmin = req.body.isAdmin;
for (user of validUsersArray) {
if (newUserName != user.userName) {
if (newEmail != user.email) {
return next();
}
res.send("Email taken, please use another one");
}
}
res.send("Username taken, please try another one");
}
}
推荐阅读
- wso2 - 如何在 WSO2 EI 中处理单个节点的多个数据?
- web3 - 使用web3py模拟buy token 批准sell token 避免被骗
- apache-spark - 在指定日期运行气流作业
- php - 检查两个 DateTime 对象是否指同一天
- ionic-framework - 当离子应用程序与最近关闭时,后台模式不起作用?
- flutter - 当我将当地英语更改为阿拉伯语时,我的观点发生了变化,我该如何阻止这种情况?
- ide - 如何在 WebStorm 的 Doc 块注释中禁用关键字亮点
- gcc - 在 nasm 64 位中使用 printf 时出现分段错误
- vb.net - 想要使用 VB.net 从 Outlook 窗口的菜单栏中删除功能区图标
- javascript - 布尔值不适用于 If 语句(Javascript)