Невозможно прочитать свойство 'push' из неопределенного - vue и axios - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть;

  • API, созданный из экспресс-запуска на порту 2012
  • Приложение Vue, работающее на порту 8080

Приложение Vue связываетсяс помощью API с помощью Axios.

Я смог зарегистрировать пользователей и войти в систему, когда пользователь нажимает «зарегистрироваться» или «войти», он передает свои данные в API, если API отвечает OKсообщение, я использую это. $ router.push ('/ login'), если пользователь успешно зарегистрирован, и это. $ router.push ('/ dashboard'), если пользователь успешно вошел в систему со страницы входа в систему.Однако я продолжаю получать сообщение «не могу прочитать свойство 'push' of undefined» при попытке вызвать это. $ Router.push на панели мониторинга vue.

login.vue (this. $ Router.pushработает)

<template>
    <form id="login_form" method="post" v-on:submit.prevent="onSubmit">
        <input type="text" name="username" class="form-control" v-model="auth.username" placeholder="username" />
        <input type="password" name="password" class="form-control" v-model="auth.password" placeholder="password" />
        <input type="submit" value="Submit" />
    </form>
</template>
<script>
import Vue from 'vue'
import login_axios from '../axios/login_axios.js'

export default{
    name: 'login_form',
    data:function(){
        return{
            auth:{
                username:'',
                password:''
            }   
        }
    },
    methods:{
        onSubmit: login_axios.methods.onSubmit 
    },
    components:{
        login_axios  
    }

}
</script>

Этот компонент login_vue импортирует файл javascript с именем login_axios.js login_axios, содержащий метод onSubmit, который вызывается, когда пользователь нажимает кнопку login / submit.onSubmit проверяет, является ли res.data.auth.authenticated истиной или ложью, если это правда, он выполняет это. $ router.push to / dashboard, это работает.Однако из панели мониторинга это не работает.

login_axios.js (this. $ Router.push работает)

import Vue from 'vue'
import axios from 'axios'
import AxiosStorage from 'axios-storage'

let sessionCache = AxiosStorage.getCache('localStorage');

export default {
    methods:{
        async onSubmit(e){
            e.preventDefault();
            const res = await axios.post('http://myapi/login', this.auth);

            try{



                if(res.data.auth.authenticated){
                    sessionCache.put('authenticated', true);
                    this.$router.push('/dashboard');
                }

            } catch (error){

                console.log(error);
            }

        }
    }
}

Ниже приведен dashboard.vue, который импортирует dashboard_axios.js

dashboard.vue (невозможно прочитать свойство 'push' of undefined)

<template>
<div>
    <h1>Dashboard</h1>
    <a href="/login">Login</a>
    <a href="/register">Register</a>
    <a href="/posts">Posts</a>
    <a href="/about">About</a>
</div>
</template>
<script>
import Vue from 'vue'
import dashboard_axios from '../axios/dashboard_axios.js'


export default {
    name: 'dashboard',
    methods:{


    },
    components:{
        dashboard_axios
    }

}

</script>

Я пробовал несколько разных вещей, но в итоге я настроилЯ как константа этого.Я определил функцию verify_auth в dashboard_axios.js, а затем вызвал ее сразу после.Я ожидал бы, что это сработает, поскольку это просто функция, которую нужно вызывать.Возможно, я совершенно не в курсе, так как я не эксперт в vue, но я стараюсь как можно больше исследовать.

dashboard_axios.js (не могу прочитать свойство push из undefined)

import Vue from 'vue'
import router from 'vue-router'
import axios from 'axios'
import AxiosStorage from 'axios-storage'

const self = this;

let sessionCache = AxiosStorage.getCache('localStorage');

sessionCache.put('authenticated', false);

console.log(sessionCache.get('authenticated'));


function verify_auth(){
    if(sessionCache.get('authenticated')){
        console.log('successfully verified authentication')
        self.$router.push('/')
    }else{
        console.log('issue verifying authentication')
        self.$router.push('/login')
    }
}


verify_auth();

export default {
    name: 'dashboard_axios',
    methods:{


    },
    data: function() {

    },
    created: function(){

    }
}

1 Ответ

0 голосов
/ 20 февраля 2019

Я не уверен на 100%, если это ответ, но я нашел обходной путь.

Я импортировал файлы javascript, такие как 'dashboard_axios.js', которые не загружались так, как хотелось бы.Поэтому вместо этого я переименовал файл в dashboard_axios.vue, добавил <template></template>, оставил его пустым, а затем обернул свой js-код в <script></script>, затем в dashboard.vue я назвал тег <dashboard_axios />, и он заработалкак я и ожидал.

...