Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是图形ql';如果I';我们在Apollo客户端中使用dataIdFromObject设置了唯一标识符_Javascript_Reactjs_Graphql_React Apollo_Apollo Client - Fatal编程技术网

Javascript 是图形ql';如果I';我们在Apollo客户端中使用dataIdFromObject设置了唯一标识符

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

我使用的是graphql+mysql+react apollo,下面是
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的安全问题是什么?