Далее («профиль») внутри router.beforeEach выдает ошибку, нужна помощь, чтобы разобраться с этим - PullRequest
2 голосов
/ 30 апреля 2019

Я пытаюсь добавить контроль доступа в свое приложение. Проблема в следующем («профиль») дает мне сообщение об ошибке:

[vue-router] uncaught error during route navigation:
Invalid object

Я попытался изменить строку со следующего («профиль») на следующий (), и это работает без проблем. Также выдает ошибку для следующего («логин»). Но первый следующий («логин») работает без проблем. Может кто-нибудь помочь мне?

Мой код:

router.beforeEach((to, from, next) => {
  // Checking if user has verified the mobile number using firebase
  const currentUser = firebase.auth().currentUser
  // Checking if the requested path has meta requiresAuth
  var isUserLoggedIn = false
  const loginTokenExistsFlag = CookieManager.checkIfLoginTokenExists()
  if (loginTokenExistsFlag && currentUser) {
    isUserLoggedIn = true
  }
  var isUserActivated = false
  const profileDetails = CookieManager.getProfileDetails()
  if (profileDetails != null) {
    if (
      profileDetails.profile_user_description == null &&
      profileDetails.profile_name == null
    ) {
      isUserActivated = false
    }
  }
  if (isUserLoggedIn == false) {
    next('login')
  } else if (isUserLoggedIn == true && isUserActivated == false) {
    next('profile')
  } else {
    next()
  }
})

Определение маршрута

const router = new Router({
  mode: 'history',
  linkActiveClass: 'active',
  base: process.env.BASE_URL,
  routes: [
    {
      path: '/',
      redirect: '/login'
    },
    {
      path: '/home',
      name: 'home',
      component: Home,
      meta: {
        requiresAuth: true
      }
    },
    {
      path: '/profile',
      name: 'profile',
      component: Profile,
      meta: {
        requiresAuth: true
      }
    },
    {
      path: '/login',
      name: 'login',
      component: Login
    },
    {
      path: '*',
      redirect: '/login'
    }
  ]
})
export default router

error screenshot

1 Ответ

0 голосов
/ 30 апреля 2019

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

import Vue from 'vue'
import Router from 'vue-router'
import Home from '@/views/Home.vue'
import Login from '@/views/Login.vue'
import Profile from '@/views/Profile.vue'
import firebase from 'firebase/app'
import 'firebase/auth'
import CookieManager from '@/managers/CookieManager.js'

Vue.use(Router)

const router = new Router({
  mode: 'history',
  linkActiveClass: 'active',
  base: process.env.BASE_URL,
  routes: [
    {
      path: '/',
      redirect: '/home'
    },
    {
      path: '/home',
      name: 'home',
      component: Home,
      meta: {
        requiresAuth: true,
        requiresActivation: true
      }
    },
    {
      path: '/profile',
      name: 'profile',
      component: Profile,
      meta: {
        requiresAuth: true
      }
    },
    {
      path: '/login',
      name: 'login',
      component: Login
    }
  ]
})
export default router

router.beforeEach((to, from, next) => {
  // Checking if user has verified the mobile number using firebase
  const currentUser = firebase.auth().currentUser
  var isUserLoggedIn = false
  const loginTokenExistsFlag = CookieManager.checkIfLoginTokenExists()
  if (loginTokenExistsFlag && currentUser) {
    isUserLoggedIn = true
  }
  var isUserActivated = false
  const profileDetails = CookieManager.getProfileDetails()
  if (profileDetails != null) {
    if (
      profileDetails.profile_user_description == null &&
      profileDetails.profile_name == null
    ) {
      isUserActivated = false
    }
  }

  // Checking if the requested path has meta requiresAuth
  var requiresAuth = to.matched.some(record => record.meta.requiresAuth)
  var requiresActivation = to.matched.some(
    record => record.meta.requiresActivation
  )

  if (requiresAuth && requiresActivation) {
    if (isUserLoggedIn && isUserActivated) {
      next()
    } else if (requiresAuth && !isUserActivated) {
      next('/profile')
    } else {
      next('/login')
    }
  } else if (requiresAuth && !requiresActivation) {
    next()
  } else if (!requiresAuth) {
    if (isUserLoggedIn) {
      next('/home')
    } else {
      next()
    }
  }
})
...