我一直在努力使它工作两天。我是Nuxt的全新用户(尽管我已经使用Vue几年了),所以我只是想让我全神贯注于这一切的工作方式。
在我的Nuxt项目中,我安装了Axios模块:
nuxt.config.js
export default {
plugins: [
...
'~/plugins/axios',
],
axios: {
baseURL: 'https://my-url.com/wp-json/wp-v2',
https: true,
},
}
plugins / axios.js
export default ({ $axios, env }) => {
$axios.onRequest(config => {
$axios.setToken(env.WP_API_KEY, 'Bearer');
});
}
在我的页面中,我正在尝试使用asyncData
函数从WordPress API中提取数据,例如:
export default {
async asyncData(context) {
const data = await context.$axios.$get('/media');
console.log(data);
return { data };
}
}
但是,我一直收到401未经授权错误,从本质上说我的Authorization: Bearer <token>
没有通过。但是,使用Postman,我可以验证此端点确实起作用并返回我需要的所有JSON,因此问题必须出在设置axios全局标头的方式上。
很难找到有关如何使用Nuxt / Axios模块设置全局头的任何实际示例。我在docs中看到了如何使用setToken
,但是它并没有完全显示出放置位置。
我设置错了什么,如何解决?
答案 0 :(得分:6)
发布问题后15分钟才能正常工作。
像这样设置标题似乎可行。我不确定为什么setToken
方法不起作用。
export default ({ $axios, env }) => {
$axios.onRequest(config => {
config.headers.common['Authorization'] = `Bearer ${env.WP_API_KEY}`;
});
}
答案 1 :(得分:1)
如果您使用的是 Nuxt 身份验证模块,这是我实现的方法。
// nuxt.config.js
modules: [
'@nuxtjs/auth',
'@nuxtjs/axios',
],
auth: {
strategies: {
local: {
endpoints: {
login: { url: '/auth/login', method: 'post', propertyName: 'accessToken' },
logout: false,
user: { url: '/auth/me', method: 'get', propertyName: false }
},
}
},
redirect: {
login: '/auth/signin',
logout: '/auth/signin',
callback: false,
home: false,
},
cookie: false,
token: {
prefix: 'token',
},
plugins: ['~/plugins/auth.js'],
},
// plugins/axios.js
export default function ({ $axios, $auth, redirect, store }) {
$axios.onRequest((config) => {
config.headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': store.state.auth.tokenlocal, // refers to nuxt.config.js->auth.token
}
})
$axios.onError((error) => {
if (error.response.status === 500) {
redirect('/error')
}
})
}
// store/index.js
export const getters = {
authenticated(state) {
return state.loggedIn;
},
user(state) {
return state.user;
}
};
export const state = () => ({
busy: false,
loggedIn: false,
strategy: "local",
user: false,
});