gpt4 book ai didi

javascript - 如何在Vue.js中设置自定义中间件

转载 作者:行者123 更新时间:2023-11-30 19:18:33 25 4
gpt4 key购买 nike

我一直在从事Laravel & Vue.js的大学项目。我在Vue.js中几乎是新手。

我有关于laravel middleware的想法,但是在我的项目中,我想结合使用middlewaresvue-router来制作和设置自定义vuex。例如,以authguest中间件为基础,并且如果我另外创建任何中间件,那也应该工作,我在middleware中找不到任何关于vue.js docs的文档。

这是我的store/auth模块:

import axios from 'axios'
import Cookies from 'js-cookie'
import * as types from '../mutation-types'

// state
export const state = {
user: null,
token: Cookies.get('token')
}

// getters
export const getters = {
user: state => state.user,
token: state => state.token,
check: state => state.user !== null
}

// mutations
export const mutations = {
[types.SAVE_TOKEN] (state, { token, remember }) {
state.token = token
Cookies.set('token', token, { expires: remember ? 365 : null })
},

[types.FETCH_USER_SUCCESS] (state, { user }) {
state.user = user
},

[types.FETCH_USER_FAILURE] (state) {
state.token = null
Cookies.remove('token')
},

[types.LOGOUT] (state) {
state.user = null
state.token = null

Cookies.remove('token')
},

[types.UPDATE_USER] (state, { user }) {
state.user = user
}
}

// actions
export const actions = {
saveToken ({ commit, dispatch }, payload) {
commit(types.SAVE_TOKEN, payload)
},

async fetchUser ({ commit }) {
try {
const { data } = await axios.get('/api/user')
commit(types.FETCH_USER_SUCCESS, { user: data })
} catch (e) {
commit(types.FETCH_USER_FAILURE)
}
},

updateUser ({ commit }, payload) {
commit(types.UPDATE_USER, payload)
},

async logout ({ commit }) {
try {
await axios.post('/api/logout')
} catch (e) { }

commit(types.LOGOUT)
},

async fetchOauthUrl (ctx, { provider }) {
const { data } = await axios.post(`/api/oauth/${provider}`)
return data.url
}
}


如何在 middleware中创建和调用 vue template

请建议 store/auth是否有任何更改!

最佳答案

好了,您可以创建middleware并在vue template中调用它们

middleware创建目录。所有middlewares应位于此目录中。然后创建所需的任何middleware


  (身份验证中间件)> middleware/auth.js


import store from '~/store'

export default async (to, from, next) => {
if (!store.getters['auth/check']) {
next({ name: 'login' })
} else {
next()
}
}



  (访客中间件)> middleware/guest.js


import store from '~/store'

export default (to, from, next) => {
if (store.getters['auth/check']) {
next({ name: 'home' })
} else {
next()
}
}



  (验证检查中间件)> middleware/auth-check.js


import store from '~/store'

export default async (to, from, next) => {
if (!store.getters['auth/check'] && store.getters['auth/token']) {
try {
await store.dispatch('auth/fetchUser')
} catch (e) { }
}

next()
}



  (管理员中间件)> middleware/admin.js


import store from '~/store'

export default (to, from, next) => {
if (store.getters['auth/user'].role !== 'admin') {
next({ name: 'home' })
} else {
next()
}
}


因此,您可以创建更多的 middlewares

template中调用这些中间件:

export default {
middleware: 'auth',
// middleware: 'guest',
}


不要忘记在 middlewares中加载 vue-router

// The middleware for every page of the application.
const globalMiddleware = ['locale', 'check-auth']

// Load middleware modules dynamically.
const routeMiddleware = resolveMiddleware(
require.context('~/middleware', false, /.*\.js$/)
)

function getMiddleware (components) {
const middleware = [...globalMiddleware]

components.filter(c => c.middleware).forEach(component => {
if (Array.isArray(component.middleware)) {
middleware.push(...component.middleware)
} else {
middleware.push(component.middleware)
}
})

return middleware
}

function callMiddleware (middleware, to, from, next) {
const stack = middleware.reverse()

const _next = (...args) => {
// Stop if "_next" was called with an argument or the stack is empty.
if (args.length > 0 || stack.length === 0) {
if (args.length > 0) {
router.app.$loading.finish()
}

return next(...args)
}

const middleware = stack.pop()

if (typeof middleware === 'function') {
middleware(to, from, _next)
} else if (routeMiddleware[middleware]) {
routeMiddleware[middleware](to, from, _next)
} else {
throw Error(`Undefined middleware [${middleware}]`)
}
}

_next()
}


你完成了!!!

关于javascript - 如何在Vue.js中设置自定义中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57736418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com