Является ли тип идентификатора graphql необходимым, если я установил уникальный идентификатор с dataIdFromObject в Apollo Client

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

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

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

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

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,
 });

Будете ли вы хранить идентификационный номер или просто вырезать его?

Ответ 1

Вы спрашивали

вы бы сохранили тип идентификатора или просто выровняли его

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

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

Ответ 2

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

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

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

Ответ 3

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