Nuxt 中间件中的重定向功能使状态为空

Posted

技术标签:

【中文标题】Nuxt 中间件中的重定向功能使状态为空【英文标题】:Redirect function in Nuxt middleware is making state null 【发布时间】:2021-12-22 09:41:22 【问题描述】:

我有一个 Nuxt 应用程序,它在中间件中一切正常,除非我使用重定向。 当我评论 redirect('/admin') 行时,即使控制台记录时状态数据存在,它也能正常工作。一旦我取消注释重定向行,它就会使状态为空。 如果有人知道这个问题,请帮忙。这个确切的代码在我的其他项目中有效,但不是在这里。

这是我在中间件文件夹中的auth.js 文件。

export default function ( store, route, redirect ) 
  const user = store.getters['user/user']
  const blockRouteAdmin = /\/admin\/*/g
  const blockRouteManager = /\/manager\/*/g
  const path = ['/signup', '/login']
  let value = path.includes(route.path)
  if (user) 
    if (user.isAdmin)     
      if (!route.path.match(blockRouteAdmin)) 
        redirect('/admin')
      
    
    if (user.isManager) 
      if (!route.path.match(blockRouteManager)) 
          redirect('/manager')
      
    
    if (user.isUser) 
           if (
        route.path.match(blockRouteAdmin) ||
        route.path.match(blockRouteManager) ||
        value
      ) 
        console.log('isUser', user.isUser)
        redirect('/')
      
    
  
  if (!user) 
    if (
      route.path.match(blockRouteAdmin) ||
      route.path.match(blockRouteManager)
    ) 
      redirect('/')
     else 
      redirect()
    
  

这是我的nuxt.config.js

export default 
  // Target: https://go.nuxtjs.dev/config-target
  target: 'static',

  // Global page headers: https://go.nuxtjs.dev/config-head
  head: 
    title: 'aitl',
    meta: [
       charset: 'utf-8' ,
       name: 'viewport', content: 'width=device-width, initial-scale=1' ,
       hid: 'description', name: 'description', content: '' ,
       name: 'format-detection', content: 'telephone=no' ,
    ],
    link: [ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' ],
  ,

  // Global CSS: https://go.nuxtjs.dev/config-css
  css: [],

  // Plugins to run before rendering page: https://go.nuxtjs.dev/config-plugins
  plugins: ['~/plugins/firebaseConfig.js'],

  // Auto import components: https://go.nuxtjs.dev/config-components
  components: true,

  // Modules for dev and build (recommended): https://go.nuxtjs.dev/config-modules
  buildModules: [],

  // Modules: https://go.nuxtjs.dev/config-modules
  modules: [
    // https://go.nuxtjs.dev/buefy
    'nuxt-buefy',
    // https://go.nuxtjs.dev/pwa
    '@nuxtjs/pwa',
    // https://go.nuxtjs.dev/content
    '@nuxt/content',
  ],

  // PWA module configuration: https://go.nuxtjs.dev/pwa
  pwa: 
    manifest: 
      lang: 'en',
    ,
  ,

  // Content module configuration: https://go.nuxtjs.dev/config-content
  content: ,

  // Build Configuration: https://go.nuxtjs.dev/config-build
  build: ,

我的index.js在店内。

import  vuexfireMutations  from 'vuexfire'
import  getUserFromCookie  from '../helper/index.js'

export const mutations = 
  ...vuexfireMutations,


export const actions = 
  async nuxtServerInit( dispatch, commit ,  req ) 
    try 
      const user = getUserFromCookie(req)
      if (user) 
        await dispatch('user/setUSER', 
          email: user.email,
          isAdmin: user.admin,
          isManager: user.manager,
          isUser: user.user,
          uid: user.user_id,
          name: user.name,
        )
      
     catch (err) 
      console.log(err)
    
  ,

User.js 在存储文件夹中

import  auth  from '../plugins/firebaseConfig'
import Cookies from 'js-cookie'

export const state = () => (
  user: null,
)

export const getters = 
  user(state) 
    return state.user
  ,


export const actions = 
  async userlogin( dispatch , user) 
    try 
      const token = await auth.currentUser.getIdToken(true)
      const userInfo = 
        email: user.email,
        isAdmin: user.admin,
        isManager: user.manager,
        isUser: user.user,
        uid: user.uid,
        name: user.displayName,
      
      Cookies.set('access_token', token)
      await dispatch('setUSER', userInfo)
     catch (err) 
      console.log(err)
    
  ,

  setUSER( commit , user) 
    commit('setUSER', user)
  ,


export const mutations = 
  setUSER(state, user) 
    state.user = user
  ,

【问题讨论】:

redirect 仅在服务器上可用。你确定你只在服务器上使用这条线吗? 是的,它只存在于中间件中。这个确切的代码在其他项目中对我有用。 它在另一个项目中工作不会完全帮助我们在这里 IMO。也许尝试获取完全相同的文件并检查差异。要么是拼写错误,要么是你的代码使用的上下文存在差异。我已经格式化了你的代码,现在看起来好多了。 我理解了这个问题。以前我使用目标:'静态',后来我切换到目标:'服务器'。现在它工作正常。 【参考方案1】:

问题已通过从 target: 'static' 变为 target: 'server' 解决,也就是镜像另一个工作项目的设置。

【讨论】:

以上是关于Nuxt 中间件中的重定向功能使状态为空的主要内容,如果未能解决你的问题,请参考以下文章

带有访客和身份验证中间件的 Nuxt 身份验证将经过身份验证的用户在刷新时重定向到错误的页面

带有 Firebase 和 FirebaseUI 的 Nuxt 中间件:错误:通过导航守卫从“/anything”转到“/login”时重定向

Nuxt 中间件调用两次

如何使用 Python 从 Selenium 的重定向链中获取中间 URL?

Nuxt.js:如何重定向内部方法

NUXT 中间件中未定义 Vuex 存储