Vuex动作中的Vue资源 - "这是空的"错误

时间:2017-07-20 15:09:28

标签: vue.js vuejs2 vuex vue-resource

我正在尝试从商店操作中进行GET调用。但是,我的Vue.http.get()来电会引发TypeError"这是空的"。

我完全失去了,我还没有找到其他人在其他地方遇到这个具体问题。任何帮助,将不胜感激。感谢

操作实例

  1. 用户导航至/ login /
  2. 提交登录
  3. 已通过身份验证和令牌
  4. 调度保存令牌和检索配置文件的操作
  5. 尝试在操作中使用Vue.http
  6. 时发生错误

    注意,令牌正确存储在state和localStorage中。

    Login.vue

    methods: {
        submit() {
            this.$http.post(
                this.loginEndpoint,
                this.object
            ).then(response => {
                this.$store.dispatch({
                    "type": "auth/save",
                    "token": response.body.key,
                }).then(() => {
                    this.$router.push({name: "home"})
                }).catch(error => {
                    console.log(error)
                })
            }).catch(error => {
                console.log(error)
            })
        }
    }
    

    存储

    import Vue from 'vue'
    import Vuex from 'vuex'
    import Auth from '../stores/auth.js'
    
    
    // plugins
    Vue.use(Vuex)
    
    
    export default new Vuex.Store({
        modules: {
            auth: Auth,
        },
    })
    

    auth.js - 存储模块

    import Vue from 'vue'
    
    
    export default {
        namespaced: true,
    
        state: {
            token: null,
            profile: {},
        },
    
        mutations: {
            setProfile(state, payload) {
                state.profile = payload.profile
            },
    
            setToken(state, payload) {
                state.token = payload.token
            },
        },
    
        actions: {
            save: (context, payload) => {
                return new Promise((resolve, reject) => {
                    const url = "/rest-auth/user/"
    
                    context.commit('setToken', {
                        token: payload.token,
                    })
    
                    localStorage.setItem("token", payload.token)
    
                    console.log("get user profile")
    
                    // *** Error below calling Vue.http.get ***
                    // TypeError: this is null
                    Vue.http.get(url).then(response => {
                        console.log("Profile received")
    
                        context.commit('setProfile', {
                            profile: response.body,
                        })
    
                        localStorage.setItem("profile", response.body)
                        resolve()
    
                    }).catch(error => {
                        reject(error)
                    })
                })
            },
        },
    }
    

    堆栈跟踪

    TypeError: this is null
    Stack trace:
    @webpack-internal:///10:42:9
    exec@webpack-internal:///6:1150:21
    Client/<@webpack-internal:///6:1179:13
    PromiseObj@webpack-internal:///6:200:24
    Client@webpack-internal:///6:1143:16
    Http@webpack-internal:///6:1400:12
    Http[method$$1]@webpack-internal:///6:1431:16
    save/<@webpack-internal:///14:112:17
    save@webpack-internal:///14:90:20
    wrappedActionHandler@webpack-internal:///7:604:15
    dispatch@webpack-internal:///7:347:7
    boundDispatch@webpack-internal:///7:272:12
    submit/<@webpack-internal:///17:100:17
    

1 个答案:

答案 0 :(得分:0)

事实证明,我的Vue实例中的代码导致了问题。在那里,我将csrf值推送到X-CSRFTOKEN标题。

我正在使用Django和DRF。我刚刚从SessionAuthentication切换到使用TokenAuthentication,现在已经知道不需要传递csrf令牌。

以下代码来自我的main.js,删除后问题已解决。

违规代码

/* Add the csrf token to the request header */
Vue.http.interceptors.push(function(request, next) {
    let token = this.$cookie.get("csrftoken")
    request.headers.set('X-CSRFTOKEN', token)
    next()
});

究竟为什么导致TypeError被抛出我无法说出来。