Vue.js 使用Vuex和Axios在Vuejs中处理错误的最佳实践

Vue.js 使用Vuex和Axios在Vuejs中处理错误的最佳实践,vue.js,axios,vuex,Vue.js,Axios,Vuex,我正在使用Vuex+axios,我想知道处理Vuex+axios错误的最佳实践。我现在所做的是,当我使用axios请求时,它返回一个错误,它将在变异中提交并更新我的状态。我想做的是,如果我的请求出现响应错误,它将返回到我的组件,这样我可以更快地处理错误 与angular一样,有一个依赖项注入,响应将返回到组件。让我告诉您,我用于错误记录的方法是这样的。 通过此操作,您可以通过打开代码来处理所有vue错误。 window.onerror = function (message, source, l

我正在使用Vuex+axios,我想知道处理Vuex+axios错误的最佳实践。我现在所做的是,当我使用axios请求时,它返回一个错误,它将在变异中提交并更新我的状态。我想做的是,如果我的请求出现响应错误,它将返回到我的组件,这样我可以更快地处理错误


与angular一样,有一个依赖项注入,响应将返回到组件。

让我告诉您,我用于错误记录的方法是这样的。 通过此操作,您可以通过打开代码来处理所有vue错误。

window.onerror = function (message, source, lineno, colno, error) {
  /// what you want to do with error here
};
这是浏览器的全局错误处理程序。如果有任何错误未引起注意,则可以通过此方法处理

另外,如果你想处理你的错误。你可以这样做

axios.get('/user?ID=12345')
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
      // when you throw error this will also fetch error.
       throw error;
  });
如果您想查看vue中的错误处理,可以使用。

让我为您提供一个使用window.onerror的链接


吃你的蛋糕,也吃它。假设您已经在使用

axios.interceptors.response.use(函数(响应){
返回响应;
},函数(错误){
store.commit('ERROR',ERROR)//这里只是猜测一下
return Promise.reject(error)//这是最重要的部分
})
这将使承诺拒绝返回给调用方,因此在您的组件中,类似于

axios.whatever(…)。然后(res=>{
//快乐的日子
},err=>{
//哦,不!
})

我得出的结论是,它们不可能总是存在处理错误的通用方法,因此它们必须以某种方式与上下文相耦合。有单独的api文件是一件好事,但要用上面提到的方法来解决这个问题。 我有单独的api文件,我正在执行以下操作:

//comments-api.js
export default {
    get (url, handler){
        //return the promise to further possible chains
        return axios.get(url)
            .then( response => handler.success(response.data) )
            .catch( error => handler.serverDownOrUnexpected(error.response) )
    },
}
//comments.js - vuex module
import $comments from './../../services/api/comments-api'
...
actions: {
    $comments.get(url, {
        success: (data) => commit('success_handler', data),
        serverDownOrUnexpected: (error) => commit('unexpected', error)
        //so on...
    })
}
...
在这种方法中,每当我想改变某些错误的处理方式时,我必须在一个地方进行更改,再加上解耦代码的好处

承诺的力量!(加上异步/等待) vue方法(mycomponent.js)

带有状态操作(store/actions.js)

使用axios

http
    .post('/your/api/endpoint', payload)
    .then(response => {
        console.log(response.data)
    })
    .catch(error => {
        console.log('error', error.data)
    });

您可以使用事件总线,如下所示

import Vue from 'vue'

export const EventBus = new Vue();
然后触发错误

axios.get(...)
  .catch(function (error) {
     EventBus.$emit('error', error)
  });

我只是用接球。和我切换到vuex之前使用的一样。它可能是最通用、文档最完整的解决方案,让我可以像以前一样继续将错误插入组件的html中。它还允许我继续使用loading=true、loading=false的html动画

因此,我得到了3个状态属性:数据、错误和加载。这似乎对我有用。您的里程可能会有所不同。我也在使用vuex模块和名称空间,但这里是一个简化的示例

//somevuexstore.js

actions: {

fetchData(context) {

    axios
        .get("api/someendpoint")
        .then(response => {
            context.commit('loading')
            context.commit('organizations', response.data)

        }).catch(error => {
            console.log(error.response.data.message || error.message)
            context.commit('error', error)
        });
},

mutations: {
organizations(state, data) {
    return state.organization = data
},

error(state, data) {
    return state.error = data
},

loading(state) {
    return state.loading = false
},

state= {

organization: [],
error: '',
loading: true
}
然后在我的component.vue中,它与我以前的操作方式非常相似,只是添加了计算属性

computed: {
...mapState({
        getError: 'error',
        getLoading: 'loading',
        getAllOrg: 'organization',
}),
}

mounted() {
      this.$store.dispatch('fetchData')
}
我的html就是这样的东西

<tr v-for="value in getAllOrg" :key="value.id">
   <td>{{ value.id }}</td>
   <td>{{ value.email }}</td>
   <td>{{ value.name }}</td>
   <td>{{ value.['created-at'] | formatDate }}</td>
</tr>

{{value.id}
{{value.email}
{{value.name}
{{value.['created-at']|formatDate}
我在适当的地方插入错误消息

<div v-if="getError" class="error">
   <p>{{ getError }}</p>
</div>

{{getError}}

对于加载动画,我在适当的地方使用插入html的包

<div v-if="getLoading" style="height:37px;">
    <p>
      <bar-loader class="custom-class" color="#c2c2c2" 
      getLoading="getLoading" 
      :width="130"></bar-loader>
   </p>


将“上次加载”状态添加到Vuex中,并观察根目录中的更改

这看起来可能很繁重和复杂,但它是合乎逻辑的,可以很好地分离组件


额外好处:如果您已加载数据并且尝试成功,您将立即知道

是否始终需要在vuex中使用axios inside Action来提交表单?或者我可以在我的组件中使用axios,然后将数据传递给vuex中的Action进行变异?@LordGrim对不起,我真的不知道你在问什么。问题应该出现在你上面的帖子中,而不是评论中。我有
Uncaught(in promise)类型错误:无法读取未定义的属性“version”
错误位于
return promise.reject(error)
@MKatleast3我建议你打开一个新问题。我的代码中没有这样的代码answer@Phil我是唯一一个看到返回承诺。拒绝(错误)//这是重要的部分lol的人吗?我是否应该导入
承诺
<tr v-for="value in getAllOrg" :key="value.id">
   <td>{{ value.id }}</td>
   <td>{{ value.email }}</td>
   <td>{{ value.name }}</td>
   <td>{{ value.['created-at'] | formatDate }}</td>
</tr>
<div v-if="getError" class="error">
   <p>{{ getError }}</p>
</div>
<div v-if="getLoading" style="height:37px;">
    <p>
      <bar-loader class="custom-class" color="#c2c2c2" 
      getLoading="getLoading" 
      :width="130"></bar-loader>
   </p>