Я знаю, что есть много сообщений об этой теме c, и я знаю, в чем моя проблема, но я не могу найти где.
Я пытаюсь создать токен refre sh на стороне клиента, и он отлично работает, но когда я перефразирую sh мою страницу, у меня возникают некоторые проблемы с заголовками, и мое действие refreshToken завершилось неудачно из-за ошибки сервера "Невозможно установить заголовки после того, как они отправлены клиенту ".
Это мой индекс. js магазин, в котором я получаю токен с cookie-файлами (cook ie -universal-nuxt plugin), а затем пытаюсь получить информацию о пользователе с токеном, затем установите его в хранилище
// store/index.js
export const actions = {
async nuxtServerInit({ commit, dispatch }, { app, req }) {
const { host } = req.headers;
// Find dynamically sub domain
if (host) {
const pprod = {pProdUrl};
const dev = {devUrl};
this.$axios.defaults.baseURL = process.env.NODE_ENV === 'development' ? `${dev}` : `${pprod}`;
try {
const company = await this.$api.company.getCompany();
commit('SET_COMPANY', company.data.data);
await dispatch('fetch', app);
} catch (err) {
dispatch('auth/AUTH_LOGOUT');
throw err;
}
}
},
// Update token
async updateToken({ commit }, token) {
// Update token in store's state
commit('auth/AUTH_SUCCESS', token);
// Set Authorization token for all axios requests
this.$axios.setToken(token, 'Bearer');
// Update cookies
if (process.browser) {
// ...Browser
if (token) {
this.$cookies.set('token', token);
} else {
this.$cookies.remove('token', token);
}
} else {
// ...Server
this.$axios.defaults.headers.common.Authorization = token;
this.app.context.res.setHeader('Authorization', token);
}
},
// Fetch Token
async fetchToken({ dispatch }, app) {
// Try to extract token from cookies
const token = app.$cookies.get('token');
if (token) {
await dispatch('updateToken', token);
}
},
// Fetch
async fetch({ state, dispatch }, app) {
// Fetch and update latest token
await dispatch('fetchToken', app);
// Skip if there is no token set
if (!state.auth.token) {
return;
}
// Try to get user profile
try {
await dispatch('user/GET_USER_INFOS');
} catch (e) {
// Reset store
await dispatch('auth/AUTH_LOGOUT');
}
},
async fetchCompany({ commit, dispatch }) {
return this.$api.company.getCompany()
.then((result) => {
commit('SET_COMPANY', result.data);
})
.catch((err) => {
dispatch('auth/AUTH_LOGOUT');
throw err;
});
},
};
есть мой плагин refreshToken. js, который работает на стороне клиента, когда я вошел в систему
// plugin/refreshToken.js
export default async function ({ app }) {
setInterval(async () => {
const { token } = app.store.state.auth;
const { store } = app;
if (token) {
await store.dispatch('auth/REFRESH_TOKEN', { token });
}
}, 5000);
}
, и мое действие для refre sh жетон. Если я комментирую this.$cookies.set('token', refreshToken);
, у меня нет ошибок заголовков, но я должен установить этот новый токен в моих файлах cookie, потому что он нужен моему nuxtServer на странице refre sh.
// store/auth.js
REFRESH_TOKEN({ commit, dispatch }, token) {
return this.$api.auth.refreshToken(token)
.then((result) => {
if (result) {
const refreshToken = result.access_token;
commit('AUTH_SUCCESS', refreshToken);
this.$cookies.set('token', refreshToken);
this.$axios.setToken(refreshToken, 'Bearer');
// this.$axios.setHeader('Authorization', `Bearer ${refreshToken}`);
// this.$axios.setHeader('Authorization', `${refreshToken} Bearer`);
}
}).catch((err) => {
dispatch('AUTH_LOGOUT');
throw err;
});
},
Я знаю, что мой код должен отправить несколько ответов на один и тот же звонок, но я не знаю, где и как я могу это исправить. Спасибо за помощь