如果我在Apollo Client中使用dataIdFromObject设置唯一标识符,那么是否需要graphql的ID类型

时间:2018-04-25 16:40:54

标签: javascript reactjs graphql react-apollo apollo-client

我使用的是graphql + mysql + react-apollo,这是User表的graphql类型之一:

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

ID scalar typegraphql的问题在于,当mysql中的主键为int时,它会以字符串形式返回,并且它在前端创建了一些类型冲突。

我可以根本不使用ID标量类型,因为我已经为Apollo Client中的每个对象设置了dataIdFromObject的唯一标识符:

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

你会保留ID类型还是只丢弃它?

3 个答案:

答案 0 :(得分:4)

您问

  

您是保留ID类型还是放弃ID类型

我通常建议保留ID类型,而不要向客户端暴露您正在使用的整数。如果这是一个新的数据集,则使用uuids作为偏移量的PK甚至可能会更好。它将变得“更安全”和“更安全”,因为您不太可能意外地使某人访问别人的东西。

无论哪种方式,我都建议按照Relay规范使ID“不透明”,这样,如果您更改数据存储区,则以后可以更改它们,而又不影响客户端。应用程序通常会进行自己的类型检查,因此您要确保您的东西在这方面不会发生任何变化。

答案 1 :(得分:3)

您应该为解析器定义自定义标量。

在你的解析器中,你应该为你期望int的ID添加一个,或者你可以在解析器中的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

答案 2 :(得分:0)

试试这个 type User { id: Int! name: String! }