GraphQL问题:定义为String类型的createdBy参数被识别为ID类型
问题描述
在使用koa、koa-graphql及原生GraphQL开发后端时遇到类型错误:明明把GraphQL参数字段createdBy定义成了String类型,系统却偏偏期望它是ID类型。
- 输入MongoDB生成的随机ID时,系统能正常运行,会把这个值识别成ID类型;
- 但把字段改名叫
createdUsername,就能正常接收字符串参数。
想保留createdBy这个字段名同时设为String类型,搞不懂为啥名称会导致类型识别异常。
对应的输入类型定义代码如下:
const clientFilterInputFields = { type: {type: GraphQLID}, company: { type: GraphQLString }, person: { type: GraphQLString }, phone: { type: GraphQLString }, email: { type: GraphQLString }, social: { type: GraphQLString }, createdBy: { type: GraphQLString }, createdAt: { type: dateInputType } } const clientFilterInputType = new GraphQLInputObjectType({ name: 'clientFilterInput', fields: clientFilterInputFields }) export const getClientsArgs = { clientFilterInput: { type: new GraphQLNonNull(clientFilterInputType) }, pagingInput: { type: new GraphQLNonNull(pagingInputType) } }
问题原因与解决方案
原因分析
这是因为GraphQL生态里的部分工具或库(比如自动生成类型的插件、甚至koa-graphql内部的默认逻辑)会对createdBy这类带By后缀的字段做特殊处理。这类命名通常被用来表示关联其他实体(比如关联创建者用户),所以工具会默认把它推断成ID类型,直接覆盖了你手动指定的GraphQLString。
当你改名为createdUsername时,这个名称不符合工具的命名推断规则,就不会触发自动类型转换,自然就会尊重你手动设置的String类型。
解决方案
要保留createdBy字段名并设为String类型,可以试试这几个办法:
- 禁用字段自动类型推断:如果用了GraphQL Code Generator这类自动生成代码的工具,在配置里加一条规则,明确指定
createdBy的类型为String,不让工具自动推断。 - 强化字段定义:给
createdBy字段加上描述或者更明确的配置,让工具不会随便篡改类型:
createdBy: { type: GraphQLString, description: "创建者用户名,字符串类型" }
- 排查中间件/插件:检查项目里有没有会修改GraphQL类型的中间件或插件(比如权限校验、自动关联的插件),这些东西可能会偷偷改字段类型。找到后调整配置,把
createdBy排除在自动转换规则之外。
内容的提问来源于stack exchange,提问作者erchis
相关产品推荐
相关产品推荐

