Невозможно установить заголовки после их отправки клиенту после обновления страницы в приложении nuxt - PullRequest
0 голосов
/ 31 января 2020

Я знаю, что есть много сообщений об этой теме 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;
      });
  },

Я знаю, что мой код должен отправить несколько ответов на один и тот же звонок, но я не знаю, где и как я могу это исправить. Спасибо за помощь

...