Автоматический постоянный запрос в клиенте и сервере Apollo не работает с ошибкой PERSISTED_QUERY_NOT_FOUND - PullRequest
0 голосов
/ 11 марта 2019

Я пытался использовать высоко разрекламированный автоматический постоянный запрос для повышения производительности в системе на основе Graphql, но потратив три дня, я не смог решить проблему ниже.Документы Apollo имеют много 404 страниц по этой теме, если вы попытаетесь найти -

На клиенте:

Я использовал

import { createPersistedQueryLink } from "apollo-link-persisted-queries";


const httpLink = createHttpLink({uri: API_URL })


const apqSwitch = createPersistedQueryLink({useGETForHashedQueries: true}).concat(httpLink);

  let links = [errorlink, stateLink, setSiteIdHeaderLink, apqLinkSwitch]

  const link = ApolloLink.from(links)

  const client = new ApolloClient({
    defaultOptions: {
      watchQuery: {
        errorPolicy: 'all'
      },
      query: {
        errorPolicy: 'all'
      },
      mutate: {
        errorPolicy: 'all'
      }
    },
    link,
    cache,
    connectToDevTools: true,
    credentials: 'include',
  })

  return { client, persistor }
}

клиентские зависимости:

"apollo-boost": "^0.1.22",
"apollo-cache-inmemory": "^1.3.11",
"apollo-cache-persist": "^0.1.1",
"apollo-client": "^2.4.7",
"apollo-link": "^1.2.3",
"apollo-link-batch-http": "^1.2.8",
"apollo-link-http": "^1.5.9",
"apollo-link-persisted-queries": "^0.2.2",
"apollo-link-retry": "^2.2.5",
"apollo-link-schema": "^1.1.1",

на сервере:

import { InMemoryLRUCache } from 'apollo-server-caching';
const { RedisCache } = require('apollo-server-cache-redis');

const server = new ApolloServer({
  ...root,
  resolverValidationOptions: {
    requireResolversForResolveType: false,
  },
  persistedQueries: {
    /*
    cache: new CustomRedis(),
    */
    cache: new RedisCache({
      host: 'localhost',
      port: xxxx,
    }),
  },
  formatError,
  formatResponse: (response, query) => formatResponse({ response, query }),
  dataSources
});

серверные зависимости:

"apollo-datasource-rest": "^0.3.2",
"apollo-errors": "^1.9.0",
"apollo-server-cache-redis": "^0.3.1",
"apollo-server-caching": "^0.3.1",
"apollo-server-express": "^2.4.8",
"cors": "^2.8.5",
"dataloader": "^1.4.0",
"express": "^4.16.3",
"glob": "^7.1.3",
"graphql": "^14.0.2",
"graphql-import": "^0.7.1",
"graphql-resolvers": "^0.2.2",

Наблюдения:

  1. Со стороны клиента я вижу, что sha1 отправляется на сервер.

переменные =% 7B% 7D & extensions =%7В% 22persistedQuery% 22% 3A% 7B% 22version% 22% 3A1% 2C% 22sha256Hash% 22% 3A% 22fd4c5f1ae3sfsf6ee0f0710b8d303a9703db7a6708b401278e2fd664f56f4e91762f% 22% 7D% 7D

Сервер ищет sha1 в кэше redis, но не может найти Сервер возвращает PersistedQueryNotFound "," MsgCode ":" PERSISTED_QUERY_NOT_FOUND error для клиента

После этого ничегослучается, что в кэше redis не выполняется заданная операция, и постоянно появляется ошибка PERSISTED_QUERY_NOT_FOUND

Проблема: APQ не работает, постоянно получая ошибку PersistedQueryNotFound

1 Ответ

0 голосов
/ 06 июля 2019

Я также настроил APQ, и они работают как положено.

Можете ли вы попробовать ниже код на client стороне? Серверная сторона почти такая же, как у меня.

import { createPersistedQueryLink } from "apollo-link-persisted-queries";
import { createHttpLink } from "apollo-link-http";
import { InMemoryCache } from "apollo-cache-inmemory";
import ApolloClient from "apollo-client";

const link = createPersistedQueryLink({useGETForHashedQueries: true}).concat(createHttpLink({ uri: "/graphql" }));

const client = new ApolloClient({
  cache: new InMemoryCache(),
  link: link,
});

Это задокументировано здесь !

...