Реакция Аполлона: сочетание отдыха и графика с состоянием связи - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь использовать конечные точки REST для публикации данных и GraphQL для запроса и выборки вместе с apollo-link-state.Моя конечная точка отдыха получает удар, и приложение создается.Но когда я пытаюсь выполнить запрос для записи в кэш, он не попадает в конечную точку graphql.и я продолжаю получать следующую ошибку:

Unhandled Rejection (Error): Can't find field findApplicationByUuid({"uuid":"912dc46d-2ef8-4a77-91bc-fec421f5e4bc"}) on object (ROOT_QUERY) {
  "application": {
    "type": "id",
    "id": "$ROOT_QUERY.application",
    "generated": true
  }
}.

Вот мой запрос GQL

import gql from 'graphql-tag';

const START_APP = gql`
  mutation startApp($type: String!) {
    application: startApp( input: { applicationType: $type})
    @rest(type: "Application", path: "v1/member/application/create", method: "POST") {
      uuid: applicationUuid
    }
  }
`;

const GET_APP = gql`
  query getAppByUuid($uuid: String!) {
    application: findApplicationByUuid(uuid: $uuid) {
      uuid,
      type,
      version,
    }
  }
`;

export {
  START_APP,
  GET_APP,
};

Вот мой распознаватель:

import { START_APP, GET_APP } from './application'
import client from '../apolloClient';


const startApp = async (_, { type }, { cache }) => {
  client.mutate({
    variables: { type },
    mutation: START_APP,
  }).then(({ data: { application } }) => {
    const { uuid } = application;

    const { data } = cache.readQuery({
      query: GET_APP,
      variables: { uuid },
    });

    cache.writeQuery({
      query: GET_APP,
      data,
    });
  });
};

const resolvers = {
  Mutation: {
    startApp,
  },
};

Вот мои ссылки:

import { resolvers, defaults } from './resolvers';

const cache = new InMemoryCache();

const errorLink = onError(({ graphQLErrors, networkError }) => {
  if (graphQLErrors)
    graphQLErrors.map(({ message, locations, path }) =>
      console.log(`[GQL Error]: Msg: ${message}, Loc: ${locations}, Path: ${path}`));
  if (networkError) console.log(`[Network error]: ${networkError}`);
});

const stateLink = withClientState({
  cache,
  defaults,
  resolvers,
});

const restLink = new RestLink({
  uri: 'http://localhost:7010/api/',
  credentials: 'include',
});

const batchHttpLink = new BatchHttpLink({
  uri: 'http://localhost:7010/api/graphql',
  credentials: 'include',
});

const httpLink = new HttpLink({
  uri: 'http://loaclhost:7010/api/graphql',
  credentials: 'include',
});

const link = ApolloLink.from([
  errorLink,
  stateLink,
  restLink,
  httpLink,
]);

мой клиент

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

Мой компонент реагирования:

// Remote Mutation
const START_APP = gql`
  mutation startApp($type: String!) {
    startApp(type: $type) @client {
      uuid
    }
  }
`;

const StartApp = ({ match }) => {
  const { type } = match.params;

  return (
    <Mutation mutation={START_APP} variables={{ type }}>
      {startApp => (<button onClick={startApp}>click me</button>)}
    </Mutation>
  )
};

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

...