как исправить ошибки в типах графиков мутаций - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь сделать мутацию GraphQl, используя apollo graphQl client .

Создает error 500, когда переменные мутации содержат ___typename свойства (которых, очевидно, нет в схеме graphQl).

Чтобы исправить это,можно установить addTypename: false в конфигурации клиента graphQl:

const graphqlClient = new ApolloClient({
  link: authLink.concat(httpLink),
  cache: new InMemoryCache({
    addTypename: false
  })
})

Теперь мутация почти работает…

Но есть новая ошибка: You're using fragments in your queries, but either don't have the addTypename: true option set in Apollo Client, or you are trying to write a fragment to the store without the __typename. Please turn on the addTypename option and include __typename when writing fragments so that Apollo Client can accurately match fragments.

Так как же настроить клиент GraphQl для обработки мутаций?

сейчас я использую функцию очистки, найденную здесь :

const removeTypename = (value) => {
  if (value === null || value === undefined) {
    return value;
  } else if (Array.isArray(value)) {
    return value.map(v => removeTypename(v));
  } else if (typeof value === 'object') {
    const newObj = {};
    Object.keys(value).forEach(key => {
      if (key !== '__typename') {
        newObj[key] = removeTypename(value[key]);
      }
    });
    return newObj;
  }
  return value;
};

, ноэто кажется хакерским.Есть ли что-то встроенное в GraphQl клиент?

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Итак, благодаря идее @Daniel Rearden и этому комментарию я использую пользовательскую ссылку apollo для удаления названий типов из переменных мутаций:

const omitTypename = (key, value) => {
  return key === '__typename' ? undefined : value
}

const omitTypenameLink = new ApolloLink((operation, forward) => {
  if (operation.variables) {
    operation.variables = JSON.parse(
      JSON.stringify(operation.variables),
      omitTypename
    )
  }
  return forward(operation)
})

Затем используйте ее с другими ссылкамивот так:

const link = ApolloLink.from([authLink, omitTypenameLink, httpLink])
const cache = new InMemoryCache()

const graphqlClient = new ApolloClient({
  link,
  cache
})
0 голосов
/ 13 октября 2018

Принятие значения какого-либо запроса с последующим подключением его к мутации в качестве переменной является нетипичным сценарием, поэтому непросто решить, что вы пытаетесь сделать.В то время как вы можете настроить свой клиентский экземпляр таким образом, чтобы пропустить поле __typename в ваших результатах, объект __typename (вместе с id или _id) используется в качестве ключей кэша - пропуск его приведет к неожиданным последствиям.поведение, если оно не нарушает ситуацию.

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

function stripTypenames (value) {
    if (Array.isArray(value)) {
        return value.map(stripTypenames)
    } else if (value !== null && typeof(value) === "object") {
      const newObject = {}
      for (const property in value) {
          if (property !== '__typename') {
            newObject[property] = stripTypenames(value[property])
          }
      }
      return newObject
    } else {
      return value
    }
}

На заметку, если вы не используете данные на стороне клиента (например, apollo-link-state), трудно представить себе ситуацию, когда вы могли бы получить некоторыеданные с сервера, а затем должны передать эти же данные в мутацию.Если данные уже существуют на сервере, их должно быть достаточно для передачи идентификатора и получения его на стороне сервера.Если вам приходится прыгать через подобные скачки, это может быть индикатором того, что сам API должен измениться.

...