我使用的是graphql + mysql + react-apollo,这是User
表的graphql类型之一:
type User {
id: ID!
name: String!
}
ID scalar type
中graphql
的问题在于,当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类型还是只丢弃它?
答案 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
}
}
}),
};
答案 2 :(得分:0)
试试这个
type User {
id: Int!
name: String!
}