es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo acceder a los datos de componentes de Vue y enrutador desde funciones de JavaScript externas?

Soy nuevo en Vue. Estoy intentando construir un tipo de middleware en el que pueda verificar todos los códigos de estado y manejarlo de la manera que desee.

Quiero usar esta función en cualquier lugar donde envíe una solicitud al backend. Para evitar la duplicación de código, estoy utilizando una función de middleware.

La función:

problema 1: Quiero enviar una nueva ruta al router para redirigir, pero no sé cómo acceder al router.

problema 2: Quiero cambiar los datos en el componente Vue desde esta función. Quiero mostrar el error al usuario de acuerdo con el error que recibo del servidor. Por lo tanto, quiero acceder a la propiedad de error en los datos del componente desde donde se llama esta función.

Llamo a esta función en el catch de la solicitud axios.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para resolver el problema 1, puede pasar la instancia del enrutador (router) como parámetro a la función de middleware. Entonces, en su componente Vue, puede importar el enrutador y pasarlo como parámetro al llamar a la función de middleware.

    Por ejemplo:

    // en su componente Vue
    import router from 'vue-router'
    import { serverErrorMiddleware } from './middleware'
    
    async submitForm(event){
        event.preventDefault()
    
        try {
            const response = await axios.post('/api/register', { /* data */ })
            console.log(response)
        } catch (err) {
            serverErrorMiddleware(err.response, router) // pase la instancia del enrutador como parámetro
        }
    }
    

    Luego, en su función de middleware, puede acceder a la instancia del enrutador y usar su método push() para redirigir a la ruta deseada.

    Por ejemplo:

    // en su función de middleware
    module.exports.serverErrorMiddleware = async (res, router) => {
        const status = res.status;
        if (status == 500) return router.push('/error')
        if (status == 404) return router.push('/notfound')
        if (status == 302) return router.push('/login')
        // ...
    }
    

    Para resolver el problema 2, puede pasar la instancia del componente Vue como parámetro a la función de middleware. Entonces, en su componente Vue, puede pasar this como parámetro al llamar a la función de middleware.

    Por ejemplo:

    // en su componente Vue
    import router from 'vue-router'
    import { serverErrorMiddleware } from './middleware'
    
    async submitForm(event){
        event.preventDefault()
    
        try {
            const response = await axios.post('/api/register', { /* data */ })
            console.log(response)
        } catch (err) {
            serverErrorMiddleware(err.response, router, this) // pase la instancia del componente Vue como parámetro
        }
    }
    

    Luego, en su función de middleware, puede acceder a la instancia del componente Vue y modificar sus propiedades de datos en consecuencia.

    Por ejemplo:

    // en su función de middleware
    module.exports.serverErrorMiddleware = async (res, router, vm) => {
        const status = res.status;
        if (status == 400) vm.error = res.error.message
        // ...
    }
    

Comments are closed.