【发布时间】:2019-12-15 23:41:36
【问题描述】:
直到现在,我一直在我想发出 HTTP 请求的每个 Vue 组件中导入 axios,就像这样。
<script lang="ts">
import axios from 'axios';
@Component
export default class ExamplePage extends Vue {
created(): void {
axios.post(some_path);
}
}
但是,现在我想为所有 axios 请求定义一个全局拦截器,基本上是为了捕获来自后端服务器(Rails)的所有 401 unauthorized 响应并注销用户。
到目前为止我的理解是你必须实例化 axios 一次并在任何地方使用它,而不是在每个文件中导入和使用不同的实例。
// application.js
import '../assets/sass/base.sass';
import App from '../app';
import Vue from 'vue';
import VueRouter from 'vue-router';
import axios from 'axios';
import router from '../routes';
Vue.use(VueRouter);
document.addEventListener('DOMContentLoaded', () => {
new Vue({
el: '#application',
router,
render: (h) => h(App),
});
});
axios.interceptors.response.use(
response => response,
error => {
const status = error.response;
if(status === 401) {
// do stuff
}
}
);
Vue.prototype.$http = axios
当我尝试在另一个文件中调用 this.$http.put(...) 时,它说属性 $http 不存在(我猜这是因为该组件上下文中的 this 是组件本身,但我不确定)。我该如何解决这个问题?
[UPDATE]感谢回复,我决定在单独的文件中初始化 axios 实例,然后改用它。但是,这仍然不起作用。 401 响应似乎根本没有触发拦截器。
是否需要一些额外的配置?
// axios-instance.ts
import axios, { AxiosInstance } from 'axios';
const axiosInstance: AxiosInstance = axios.create();
axiosInstance.interceptors.response.use(
response => response.data,
async function(error) {
console.log("THIS IS THE 401 INTERCEPTOR")
const status = error.response;
if(status === 401) {
// Log out user
}
}
);
export default axiosInstance;
// Some component
<script lang="ts">
import axiosInstance from 'axios-instance';
@Component
export default class ExamplePage extends Vue {
created(): void {
axiosInstance.post(some_path);
}
}
【问题讨论】:
-
你为什么不试试github.com/imcvampire/vue-axios?
-
你不能在
application.js中写this.$http.interceptors,你需要使用axios.interceptors。如果这不是您的问题的原因,您能否更新您的问题,以包括对put的呼叫不起作用。没有一些上下文,很难判断你是否正确地做到了这一点。 -
@skirtle 我将我对 axios 实例的引用更改为
axios,但是当我尝试在任何其他文件中调用它时,它仍然会出现“属性 '$http' 在类型'ExamplePage 上不存在' '(组件名称)”。正如我在上面所写的,这可能是因为该组件上下文中的this指的是组件本身。进一步的建议表示赞赏。 -
自从我上次查看以来,问题似乎发生了重大变化,现在在 TypeScript 中。当问题变化如此之大时,很难给出任何答案。在您的最新代码中,您有
const status = error.response;,它可能应该是const status = error.response.status;。错误处理程序也没有返回被拒绝的承诺,这可能证明是有问题的。
标签: javascript typescript vue.js axios