Ошибка входа в приложение с моим приложением fullstack vue express - PullRequest
0 голосов
/ 24 января 2020

Я следую учебному пособию по созданию приложения для входа в систему с полным стеком, используя vue. js в клиентской части, express в серверной части и mongodb, когда я регистрирую нового пользователя и регистрируюсь приложение работает с данными электронной почты и паролем, но когда я ввожу данные, не найденные в базе данных, приложение ведет себя как зарегистрированный пользователь, переходит на страницу профиля и показывает кнопку «Выйти». вот скрипт моего логина. vue компонент

    <script>
import axios from 'axios'
import router from '../router'
import EventBus from './EventBus'
export default {
  data () {
    return {
      email: '',
      password: ''
    }
  },
  methods: {
    login () {
      axios.post('users/login', {
        email: this.email,
        password: this.password
      }).then(res => {
        localStorage.setItem('usertoken', res.data)
        this.email = ''
        this.password = ''
        router.push({ name: 'Profile' })
    this.emitMethod()
      }).catch(err => {
        console.log(err)
      })

    },
    emitMethod () {
      EventBus.$emit('logged-in', 'loggedin')
    }
  }
}
</script>

скрипт скрипта Navbar. vue compenent

<script>
import EventBus from './EventBus'
EventBus.$on('logged-in', test => {
  console.log(test)
})
export default {
  data () {
    return {
      auth: '',
      user: ''
    }
  },
  methods: {
    logout () {
      localStorage.removeItem('usertoken')
    }
  },
  mounted () {
    EventBus.$on('logged-in', status => {
      this.auth = status
    })
  }
}
</script>

А вот функция обратного вызова для пользователей роутера

    users.post('/login', (req, res) => {
    User.findOne({
        email: req.body.email
    })
        .then(user => {
            if (user) {
                if (bcrypt.compareSync(req.body.password, user.password)) {
                    const payload = {
                        _id: user._id,
                        first_name: user.first_name,
                        last_name: user.last_name,
                        email: user.email
                    }
                    let token = jwt.sign(payload, process.env.SECRET_KEY, {
                        expiresIn: 1440
                    })
                    res.send(token)
                } else {
                    res.json({ error: 'User does not exist' })
                }
            } else {
                res.json({ error: 'User does not exist' })
            }
        })
        .catch(err => {
            res.send('error: ' + err)
        })
})

Я хочу остановить приложение, чтобы установить auth как 'loggedin' и отобразить сообщение об ошибке, если пользователь не зарегистрирован в базе данных

Вы не можете найти полное приложение по этой ссылке https://github.com/ArjunAranetaCodes/MoreCodes-Youtube/tree/master/mevn-mongodb-login-reg

1 Ответ

1 голос
/ 24 января 2020

Если вы не укажете код состояния в ответе, он будет 200 - ОК по умолчанию. Таким образом, ваше клиентское приложение считает, что вход в систему был успешным, даже если вход не был успешным.

Вам необходимо указать коды состояния, когда вы возвращаете ответ в плохих случаях. например, не res.json({ error: "User does not exist" });, а res.status(400).json({ error: "User does not exist" });

Таким образом, ваш маршрут входа должен быть таким:

users.post("/login", (req, res) => {
  User.findOne({
    email: req.body.email
  })
    .then(user => {
      if (user) {
        if (bcrypt.compareSync(req.body.password, user.password)) {
          const payload = {
            _id: user._id,
            first_name: user.first_name,
            last_name: user.last_name,
            email: user.email
          };
          let token = jwt.sign(payload, process.env.SECRET_KEY, {
            expiresIn: 1440
          });
          res.send(token);
        } else {
          res.status(401).json({ error: "User does not exist" });
        }
      } else {
        res.status(401).json({ error: "User does not exist" });
      }
    })
    .catch(err => {
      res.status(500).send("error: " + err);
    });
});

Здесь я отправляю 401 - Unauthorized, когда пользователь не найден или когда пароль неправильно, но вы также можете рассмотреть возможность возврата 400 - Bad Request.

...