Javascript 是图形ql';如果I';我们在Apollo客户端中使用dataIdFromObject设置了唯一标识符
我使用的是graphql+mysql+react apollo,下面是Javascript 是图形ql';如果I';我们在Apollo客户端中使用dataIdFromObject设置了唯一标识符,javascript,reactjs,graphql,react-apollo,apollo-client,Javascript,Reactjs,Graphql,React Apollo,Apollo Client,我使用的是graphql+mysql+react apollo,下面是User表的graphql类型之一: type User { id: ID! name: String! } 我对graphql中的ID scalar type的问题是,当mysql中的主键是int时,它会作为字符串返回,并且在前端与typescript产生了一些类型冲突 考虑到我已经为Apollo客户端中的每个对象设置了一个唯一的标识符dataIdFromObject,我可以干脆不使用ID标量类型吗 import
User
表的graphql类型之一:
type User {
id: ID!
name: String!
}
我对graphql
中的ID scalar type
的问题是,当mysql中的主键是int
时,它会作为字符串返回,并且在前端与typescript产生了一些类型冲突
考虑到我已经为Apollo客户端中的每个对象设置了一个唯一的标识符dataIdFromObject
,我可以干脆不使用ID标量类型吗
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:Int!
名字:字符串!
}
您应该为解析器定义自定义标量
在解析器中,您应该为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
}
}
}),
};
你问的
你会保留身份证类型还是干脆放弃
我通常建议保留ID类型,不要向客户机公开您正在使用的整数。如果这是一个新的数据集,那么使用UUID作为偏移量的PK可能会更好。这将是“更安全”和“更安全”,因为你不太可能意外地让别人访问别人的东西
无论哪种方式,我都建议按照中继规范将ID设置为“不透明”,这样,如果您更改了数据存储,您就可以在不影响客户机的情况下在以后更改ID。应用程序通常会进行自己的类型检查,因此您希望确保您的内容不会在这方面发生任何可能的变化。是的,我正在考虑这一点。有没有MySQL + Copql +阿波罗用户,根本不把ID定义为标量类型?我没有考虑UUID,而将主键暴露于公众可能为时已晚。大多数ID只用于产品数据、论坛帖子等,不敏感。PK的安全问题是什么?