首页 > 解决方案 > 优化用户创建中间件

问题描述

我正在开发一个 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");
};

标签: javascriptnode.jslogging

解决方案


可能有许多较小的想法,例如使用!!

// 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");
  }
}

推荐阅读