Как добавить правильные проверки в форму регистрации и входа? - PullRequest
0 голосов
/ 21 января 2020
    registerUser: (req, res, next) => {
        const { username, email, password } = req.body
        User.create(req.body, (err, createdUser) => {
            if (err) {
                return next(err)
            } 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: (req, res, next) => {
        const { email, password } = req.body
        User.findOne({ email }, (err, user) => {
            if (err) {
                return next(err)
            } else if (!user || !password) {
                return res.status(400).json({ message: "Email and password are must" })
            } 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" })
            }

            // generate token here
            const token = auth.signToken(email)
            res.status(200).json({ user, token })
        })
    },

Я хочу проверить, есть ли уже пользователь в базе данных, тогда пользователь сможет войти в систему. Если нет, то появится сообщение «Вы не зарегистрированы». Прямо сейчас, если Я вхожу с электронной почтой, отличной от зарегистрированной, и говорит, что адрес электронной почты и пароль обязательны.

В общем, мне нужно добавить правильные проверки в форме регистрации и входа.

    handleSubmit = (event) => {
        event.preventDefault();
        const { email, password } = this.state;

        const loginData = {
            email: this.state.email,
            password: this.state.password
        }

        if (!email || !password) {
            return alert('Email and password are must.');
        }

        if (password.length < 6) {
            return alert('Password must contain 6 characters.');
        }

        if (!validator.isEmail(email)) {
            return alert('Invalid email.');
        }

        this.props.dispatch(loginUser(loginData))
        this.props.history.push("/")
    }

Во внешнем интерфейсе я перенаправляю пользователя на домашнюю страницу после входа в систему. Теперь проблема в том, что пользователь перенаправляет независимо от того, какие учетные данные. Должен ли я добавить проверки здесь, в веб-интерфейсе?

Ответы [ 2 ]

0 голосов
/ 21 января 2020

Итак, ваша проблема в том, что в loginUser, прежде чем условие достигнет !user, оно сначала войдет в !user || !password. Вот почему он постоянно говорит: «Электронная почта и пароль обязательны».

Ваш логин c будет выглядеть следующим образом:

  • Если пользователь не предоставит адрес электронной почты или пароль, вам следует немедленно верните «Email и пароль должны быть», вы больше не хотите проверять базу данных, так как они не предоставляют ничего, что делает бессмысленным поиск по БД.
  • Если пользователь предоставляет адрес электронной почты и пароль, теперь вы можете сделать БД проверьте, если нет совпадения с пользователем, предоставленным после поиска по базе данных, вы просто возвращаете «Пользователь не найден» или как вы сказали «Вы не зарегистрированы»

код:

loginUser: (req, res, next) => {
    const { email, password } = req.body
    if (!email || !password) {
        // user does not provide email or password, return immediately without db search
        return res.status(400).json({ message: "Email and password are must" })
    }
    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) {
            // user provide email and password however email deos not match any in db
            // this is equals to "You are not registered"
            return res.status(402).json({ error: "User not found" })
        } else if (!user.confirmPassword(password)) {
            return res.status(402).json({ error: "Incorrect password" })
        }

        // generate token here
        const token = auth.signToken(email)
        res.status(200).json({ user, token })
    })
},

Надеюсь, это то, что вы хотите.

0 голосов
/ 21 января 2020

(!user || !password) означает «если пользователь не найден или пароль отсутствует в теле запроса». Если вы хотите конкретно проверить, не найден ли пользователь, у вас должен быть if(!user) и действовать в соответствии с этим ... Что вы уже делаете - опустите в оператор else if. Но первое условие (if(!user || !password)) является надмножеством второго (if(!user )), поэтому вы никогда не доберетесь до второго. Вы должны переместить это условие, чтобы быть первым в последовательности.

Как правило, я бы переработал все ваше утверждение if, чтобы возможно вложить некоторые условия в другие, например

// user found:
if(user) {
    if(!user.confirmPassword(password)) {
        // user found but password is wrong
    }
} else {
    // user not found
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...