Окно Nuxt не определено при рендеринге на стороне сервера

Я пытаюсь получить заголовки авторизации из localStorage внутри своего промежуточного программного обеспечения. К сожалению, это не работает при загрузке первой страницы, потому что она отображается на сервере.

Как я мог это исправить?

const cookieName = 'feathers-jwt';
import { ApolloClient, createNetworkInterface } from 'apollo-client';
import 'isomorphic-fetch';

const API_ENDPOINT = 'http://localhost:3000/graphql';

const networkInterface = createNetworkInterface({ uri: API_ENDPOINT });

networkInterface.use([{
  applyMiddleware(req, next) {
    if (!req.options.headers) {
      req.options.headers = {};  // Create the header object if needed.
    }
    req.options.headers['authorization'] = window.localStorage.getItem(cookieName);
    next();
  }
}]);

const apolloClient = new ApolloClient({
  networkInterface,
  transportBatching: true
});

export default apolloClient;

источник: http://dev.apollodata.com/core/network.html


person Soundwave    schedule 24.07.2017    source источник


Ответы (1)


Насколько я понимаю, при рендеринге на сервере у вас нет доступа к window и document. В приложениях, которые обрабатываются как на сервере, так и на клиенте, вам необходимо встроить проверку, чтобы увидеть, где вы находитесь, и обработать это соответствующим образом.

Вы можете использовать этот фрагмент для определения того, где вы находитесь:

var canUseDOM = !!(
  typeof window !== 'undefined' &&
  window.document &&
  window.document.createElement
)

Используйте его, чтобы проверить, работаете ли вы на стороне сервера или на стороне клиента. В вашем случае я бы сделал следующее:

  1. Если вы работаете на стороне сервера, вы можете проверить файлы cookie в самом HTTP-запросе;
  2. Если вы работаете на стороне клиента, вы можете вместо этого проверить свой localStorage магазин.

Конечно, вы всегда можете выбрать отображение вашего сайта на стороне сервера как анонимного неавторизованного пользователя по умолчанию. Но это приведет к тому, что интерфейс будет мигать в авторизованном состоянии и выйти из него, и это будет раздражать пользователя.

В вашем случае я бы попытался найти файлы cookie авторизации из фактических файлов cookie, которые присутствуют в вашем HTTP-запросе.

person MHD    schedule 27.07.2017
comment
где реализовать код? можешь показать какой-нибудь пример? - person GFxJamal; 21.10.2018