Как мне реорганизовать мой код и сделать его более читабельным и чистым, используя async / await вместо обратных вызовов? - PullRequest
1 голос
/ 23 марта 2020

У меня есть следующие функции контроллера, и я хочу сделать его более чистым и обслуживаемым. Возможно, используя async/await и exec(). Кроме того, проверки выглядят не очень хорошо. Было бы здорово, если бы вы предложили мне хорошие методы для рефакторинга.

   registerUser: (req, res) => {
        const { username, email, password } = req.body
        User.create(req.body, (err, createdUser) => {
            if (err) {
                return res.status(500).json({ error: "Server error occurred" })
            } else if (!username || !email || !password) {
                return res.status(400).json({ message: "Username, email and password are must" })
            } else if (!validator.isEmail(email)) {
                return res.status(400).json({ message: "Invaid email" })
            } else if (password.length < 6) {
                return res.status(400).json({ message: "Password should be of at least 6 characters" })
            }
            else {
                return res.status(200).json({ user: createdUser })
            }
        })
    },

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

        if (!email || !password) {
            return res.status(400).json({ message: "Email and password are must" })
        }

        await User.findOne({ email }, (err, user) => {
            if (err) {
                return next(err)
            } else if (!validator.isEmail(email)) { 
                return res.status(400).json({ message: "Invalid email" })
            } else if (!user) {
                return res.status(402).json({ error: "User not found" })
            } else if (!user.confirmPassword(password)) {
                return res.status(402).json({ error: "incorrect password" })
            } 

        })
    }

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

Ваш код должен быть таким:

registerUser: async (req, res) => {
    try {
        const { username, email, password } = req.body
        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" })
        }
        return res.status(200).json({ user: await User.create({ username, email, password }) })
    } catch (error) {
        return res.status(500).json({ message: "Server error occurred" })
    }
},

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

        if (!email || !password) {
            return res.status(400).json({ message: "Email and password are must" })
        }

        if (!validator.isEmail(email)) {
            return res.status(400).json({ message: "Invalid email" })
        }

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

        if (!user) {
            return res.status(402).json({ message: "User not found" })
        }

        if (!user.confirmPassword(password)) {
            return res.status(402).json({ message: "incorrect password" })
        }


        return res.status(200).json({ message: "Login Success" })
    } catch (error) {
        return next(error)
    }
}

Но вы добираетесь до проверки схем. тогда ваш код будет таким

registerUser: async (req, res) => {
    try {
        const { username, email, password } = req.body
        return res.status(200).json({ user: await User.create({ username, email, password }) })
    } catch (error) {
        return res.status(500).json({ message: "Server error occurred" })
    }
},

loginUser: async (req, res, next) => {
    try {
        const { email, password } = req.body
        const user = await User.findOne({ email });

        if (!user) {
            return res.status(402).json({ message: "User not found" })
        }

        if (!user.confirmPassword(password)) {
            return res.status(402).json({ message: "incorrect password" })
        }

        return res.status(200).json({ message: "Login Success" })
    } catch (error) {
        return next(error)
    }
}
0 голосов
/ 23 марта 2020

Я бы лично создал класс User для обработки действий пользователя. Я предпочитаю отделить express от модели базы данных.

Посмотрите на следующее, не стесняйтесь задавать любые вопросы, которые могут у вас возникнуть:)

// Special classes to differentiate the error types
// and finally returns the appropriate code from express
class Error400 extends Error {
  constructor(msg) {
    super(msg);

    this.httpErrorCode = 400;
  }
}

class Error500 extends Error {
  constructor(msg) {
    super(msg);

    this.httpErrorCode = 500;
  }
}

// User class holding every User related actions
class User {
  model = ...

  createUser({
    username,
    email,
    password,
  }) {
    if (!username || !email || !password) {
      throw new Error400('Username, email and password are must');
    }

    if (!validator.isEmail(email)) {
      throw new Error400('Invaid email');
    }

    if (password.length < 6) {
      throw new Error400('Password should be of at least 6 characters');
    }

    try {
      return this.model.create({
        username,
        email,
        password,
      });
    } catch (err) {
      throw new Error500('Server error occurred');
    }
  }
}

// Express
registerUser: async (req, res) => {
  try {
    return res.status(200).json({
       user: await User.create(req.body)
    });
  } catch (err) {
    return res.status(err.httpErrorCode).json({
      message: err.message,
    });
  }
});
...