Как разрешить отклоненное обещание маршрута в приложении аутентификации стека MEVN - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь создать интерфейс аутентификации с помощью Vue.js, Node, Express и MongoDB.До сих пор я успешно включал регистрацию пользователей, когда имя, адрес электронной почты и пароль помещались в базу данных MongoDB при использовании пакета bcrypt для шифрования пароля.Затем пользователь повторно вводит адрес электронной почты и пароль в Login.vue.Логин, кажется, работает, поскольку панель навигации управляет переходом, чтобы отразить вход в систему.Однако содержимое экрана не перенаправляется на Profile.vue.Вместо этого экран остается на Login.vue, и в консоли появляется сообщение об ошибке с надписью uncaught (in promise) undefined.Я сузил вопрос до this.$router.push('profile') в Login.vue.console.log(this.$router.push('profile')) возвращает Promise {<rejected>: undefined}, указывая на то, что обещание перенаправить на Profile.vue было отклонено.Чтобы исправить это, я попытался реализовать различные варианты защиты маршрута в router.js, которые, как я полагал, могут вступать в конфликт с this.$router.push('profile') в Login.vue.Любая рекомендация о том, как исправить маршрутизацию для решения этой проблемы?

Login.vue

<template>
    <div class="container">
        <div class="row">
            <div class="col-md-6 mt-5 mx-auto">
              <v-form
                ref="form"
              >
                <v-text-field
                  v-model="email"
                  label="email"
                  required
                ></v-text-field>

                <v-text-field
                  v-model="password"
                  label="password"
                  required
                  :type="show1 ? 'text' : 'password'"
                ></v-text-field>

                <v-btn
                  class="mr-4"
                  @click.prevent="login"
                >
                  login
                </v-btn>
              </v-form>
            </div>
        </div>
    </div>
</template>

<script>
import axios from 'axios'
import EventBus from './EventBus'

export default {
  data () {
    return {
      email: '',
      password: '',
      show1: false
    }
  },
  methods: {
    async login () {
      let res = await axios.post('http://localhost:5000/users/login', {
        email: this.email,
        password: this.password
      })
        localStorage.setItem('usertoken', res.data)
        this.email = ''
        this.password = ''
        this.emitMethod()
        this.$router.push('profile')
    },
    emitMethod () {
      EventBus.$emit('logged-in', 'loggedin')
    }
  }
}
</script>

router.js

import Vue from 'vue'
import Router from 'vue-router'
import Login from '@/components/Login'
import Register from '@/components/Register'
import Profile from '@/components/Profile'

Vue.use(Router)

const router = new Router({
  mode: 'history',
  routes: [
    {
      path: '/login',
      name: 'Login',
      component: Login
    },
    {
      path: '/register',
      name: 'Register',
      component: Register
    },
    {
      path: '/profile',
      name: 'Profile',
      component: Profile,
      meta: {
        requiresAuth: true
      }
    }
  ]
})

router.beforeEach((to, from, next) => {
  const isLoggedIn = localStorage.getItem('token')
  const requiresAuth = to.matched.some(record => record.meta.requiresAuth)
  if (requiresAuth && !isLoggedIn) next('login')
  else if (!requiresAuth && isLoggedIn) next('profile')
  else next()
})

export default router

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