Как добавить условие в контроллер регистрации, чтобы проверить, существует ли уже адрес электронной почты? - PullRequest
0 голосов
/ 09 мая 2020

Этот API вызывается, когда пользователь пытается зарегистрироваться и ввести данные. Я хочу посмотреть, могу ли я добавить условие, в котором говорится, что электронная почта уже существует.

Думаю, мне нужно что-то вроде:

      const user = await User.find({ email })
      if (user) {
        res.status(400).json({ message: "User with this already exists" })
      }

Но я создаю нового пользователя, поэтому где следует Я размещаю вышеупомянутый запрос. Меня как-то смущает порядок исполнения.

module.exports = {
    registerUser: async(req, res, next) => {
      try {
        var {
          username,
          email,
          password
        } = req.body
        if (password) {
          const salt = bcrypt.genSaltSync(10)
          password = bcrypt.hashSync(password, salt)
        }
        if (!username || !email || !password) {
          return res
            .status(400)
            .json({
              message: "Username, email and password are must"
            })
        }
        if (!validator.isEmail(email)) {
          return res.status(400).json({
            message: "Invaid email"
          })
        }
        if (password.length < 6) {
          return res
            .status(400)
            .json({
              message: "Password should be of at least 6 characters"
            })
        }
        const user = await User.create({
          username,
          email,
          password
        })
        if (!user) {
          return res.status(404).json({
            error: "No user found "
          })
        }
        return res.status(200).json({
          user
        })
      } catch (error) {
        return next(error)
      }
    }

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Я думаю, что лучшим решением будет разместить его перед любым logi c, также я изменил res.json в блоке if на throw, потому что throw останавливает выполнение кода ниже, но res.json продолжается и это может вызвать потенциальные проблемы. Кроме того, я меняю Module.find() на Module.findOne(), потому что find() возвращает пустой массив, если ничего не было найдено, а if([emptyArray]) возвращает true

module.exports = {
    registerUser: async(req, res, next) => {
      try {
        var {
          username,
          email,
          password
        } = req.body
        const user = await User.findOne({
          email
        })
        if (user) {
          throw 'User with this already exists'
        }
        if (password) {
          const salt = bcrypt.genSaltSync(10)
          password = bcrypt.hashSync(password, salt)
        }
        if (!username || !email || !password) {
          return res
            .status(400)
            .json({
              message: "Username, email and password are must"
            })
        }
        if (!validator.isEmail(email)) {
          return res.status(400).json({
            message: "Invaid email"
          })
        }
        if (password.length < 6) {
          return res
            .status(400)
            .json({
              message: "Password should be of at least 6 characters"
            })
        }
        const user = await User.create({
          username,
          email,
          password
        })
        if (!user) {
          return res.status(404).json({
            error: "No user found "
          })
        }
        return res.status(200).json({
          user
        })
      } catch (error) {
        return next(error)
      }
    }
0 голосов
/ 09 мая 2020

Поместите его в блок try перед logi c для регистрации, потому что find имеет потенциал выброса и ошибки, если электронное письмо не существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...