Нужен ли тип идентификатора graphql, если я установил уникальный идентификатор с dataIdFromObject в клиенте Apollo - PullRequest
0 голосов
/ 25 апреля 2018

Я использую graphql + mysql + реагировать-apollo, и вот один из типов graphql для User таблицы:

type User {
  id: ID!
  name: String!
}

Моя проблема с ID scalar type в graphql заключается в том, что этоВозвращается в виде строки, когда первичные ключи * в MySQL равны int, и это создало некоторые конфликты типов во внешнем интерфейсе с машинописью.

Могу ли я просто вообще не использовать скалярный тип идентификатора, учитывая, что я уже установил уникальный идентификатор с dataIdFromObject для каждого объекта в клиенте Apollo:

import {InMemoryCache} from 'apollo-cache-inmemory';

const apolloMemoryCache = new InMemoryCache(
    {
        dataIdFromObject: ({id,__typename}) => {

          return __typename+id

        }
    }
);

const client = new ApolloClient({
   link: ApolloLink.from([authLink, httpLink]),
   cache: apolloMemoryCache,
 });

Вы бы сохранили?тип удостоверения личности или просто угробить?

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Вы должны определить собственный скаляр для вашего резольвера.

В вашем резольвере вы должны добавить один для ID, где вы ожидаете int или вы можете выполнить преобразование между int и строкой в ​​вашем резольвере.

import { GraphQLScalarType } from 'graphql';

const resolverMap = {
  ID: new GraphQLScalarType({
    name: 'ID',
    description: 'Numeric custom scalar type',
    parseValue(value) {
      let result;
      // Implement your own behavior here by setting the 'result' variable
      return result;
    },
    serialize(value) {
      let result;
      // Implement your own behavior here by setting the 'result' variable
      return result;
    },
    parseLiteral(ast) {
      switch (ast.kind) {
      // Implement your own behavior here by returning what suits your needs
      // depending on ast.kind
      }
    }
  }),
};

https://github.com/apollographql/graphql-tools/blob/master/docs/source/scalars.md#custom-graphqlscalartype-instance

0 голосов
/ 21 августа 2018

Вы спросили

Вы бы сохранили тип ID или просто отказались от него

Я обычно рекомендую сохранять тип идентификатора и НЕ показывать клиенту целое число, которое вы используете. Если это новый набор данных, вам, вероятно, будет даже лучше использовать uuids в качестве PK от смещения. Это будет «безопаснее» и «безопаснее», так как у вас меньше шансов случайно дать кому-то доступ к чужим вещам.

В любом случае, я бы порекомендовал сделать идентификаторы «непрозрачными» в соответствии со спецификацией Relay, чтобы у вас была возможность изменить их позже, если вы измените свое хранилище данных, не затрагивая ваших клиентов. Приложения часто выполняют свою собственную проверку типов, поэтому вы должны быть уверены, что ваши вещи никогда не изменятся в этом отношении, когда это возможно.

0 голосов
/ 25 апреля 2018

попробуйте вместо этого type User { id: Int! name: String! }

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