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