GraphQL的Provider类型无ID字段时,如何解决ESLint的非空唯一标识符校验错误?
GraphQL的Provider类型无ID字段时,如何解决ESLint的非空唯一标识符校验错误?
遇到这种对接现有老API、没法加真实ID字段的情况其实挺常见的,给你几个实用的解决方案:
方案一:针对性关闭ESLint规则
如果不想修改Schema结构,最直接的方式就是跳过这条校验。你可以选择:
- 单文件局部禁用:在Provider类型定义的上方添加注释,只跳过这个类型的校验:
# eslint-disable-next-line @graphql-eslint/require-id-field type Provider { """ Provider Type """ type: String """ Provider Name """ name: String! } - 全局配置调整:在你的ESLint配置文件(比如
.eslintrc.js)里,要么直接关闭规则,要么扩展允许的标识符字段名:module.exports = { rules: { // 方式一:直接关闭规则 "@graphql-eslint/require-id-field": "off", // 方式二:把name加入合法标识符列表 "@graphql-eslint/require-id-field": ["error", { "idFieldNames": ["id", "ID", "name"] }] } }
方案二:复用现有唯一字段作为ID
看你的Schema里,name字段已经是String!(非空),如果这个字段在业务逻辑里本身是唯一的,那可以直接把它当作标识符来用:
- 把
name的类型改成ID!:
ID类型本质上就是字符串的特殊标记,不会影响现有API的功能,也不需要额外的逻辑改动。type Provider { """ Provider Type """ type: String """ Provider Name (used as unique identifier) """ name: ID! } - 如果不想修改字段类型,也可以通过工具指令标记它为ID(比如Apollo的
@id指令,需架构支持):type Provider { """ Provider Type """ type: String """ Provider Name """ name: String! @id }
方案三:添加虚拟ID字段
如果上面两种方式都不合适,你可以新增一个虚拟的id字段,在resolver里复用现有字段的值生成:
type Provider { """ Provider Type """ type: String """ Provider Name """ name: String! """ Virtual unique identifier (generated from provider name) """ id: ID! }
然后在resolver里让id字段返回name的值:
const Provider = { id: (parent) => parent.name };
这样既满足了ESLint的校验要求,又不会影响现有API的使用,还可以给这个字段加@deprecated注释,说明它是虚拟字段避免误解。
备注:内容来源于stack exchange,提问作者user973347
相关产品推荐
相关产品推荐

