Хороший способ запросить объект сервера в локальном кеше - PullRequest
0 голосов
/ 20 января 2020

Итак, у меня есть база данных, в которой хранятся пользователи. Когда кто-то входит на мой сайт, он сохраняет в кэше apollo пользователя как currentUser . И я храню только его идентификатор.

Поэтому я сделал запрос на получение пользователя, передав его идентификатор:

query {
  user(id: "id") {
    id
    username
    avatar
  }
}

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

const GET_CURRENT_USER = gql`
  query getCurrentUser {
    currentUser @client
  }
`;

const GET_USER_DATA = gql`
  query getUser($id: String!) {
    user(id: $id) {
      id
      username
      avatar
    }
  }
`;


const currentUserData = useQuery(GET_CURRENT_USER);
const { currentUser } = currentUserData.data;

const { data, loading } = useQuery(GET_USER_DATA, {
  variables: { id: currentUser.id },
  fetchPolicy: "cache-and-network"
});

Здесь я могу свести его только к одному запросу (один к сервер)?

1 Ответ

1 голос
/ 20 января 2020
Значение

id, хранящееся в кэше, можно прочитать с помощью readQuery, вы можете сохранить его в другом глобальном хранилище / состоянии, например, при редукции.

Если вы используете кеш apollo в качестве глобального хранилища, тогда использование запросов является естественной частью этого процесса.

Используя readQuery, вы можете прочитать значение без запроса (но делая то же самое). Один запрос «сохранен»;)

Более глубокая интеграция (дополнительный запрос, локальный распознаватель) не очень хорошая вещь - создание ненужных зависимостей.

Если вы хотите повторно использовать этот «ненужный запрос», извлеките его в какой-то модуль или создайте пользовательский хук (id прочитанный / использованный / сохраненный один раз во время инициализации) - возможно, лучшее решение для этого сценария.

Другие решения :

  • сделать процесс входа в систему с предоставлением пользовательских данных - для вдохновения взгляните на apollo-universal-starter-kit - но это только для исходных данных (вход в систему / аватар меняется во время сеанса ??) - для дальнейших запросов пользователей все еще требуется параметр id - он должен храниться и считываться где-то в приложении.

  • make id необязательный параметр ( для getUser запроса - если вы можете изменить бэкэнд) - если не предоставлено, вернуть данные для текущего пользователя (id чтение из сеанса / токена)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...