GraphiQL Mutation问题:如何忽略查询变量中的多余对象?
解决Clerk事件数据插入Hasura时的多余变量报错问题
报错原因
Hasura的GraphQL接口会严格校验传入的变量——你的mutation只声明了特定变量(或users_insert_input类型变量),但Clerk发送的事件payload包含了未声明的顶层字段object、type,这直接触发了变量校验失败的报错。注意:Hasura只会忽略输入类型内部的多余字段,不会自动忽略未声明的顶层变量。
解决方案
方案1:过滤Clerk的Webhook Payload(最推荐)
在Clerk Webhook与Hasura之间添加字段过滤逻辑,只传递需要的内容:
- 若无法直接修改Clerk的Webhook输出,可通过中间层(如Cloudflare Worker、简单Express服务)处理payload:提取
data中的目标字段(created_at、first_name、id作为user_id、updated_at、profile_image_url),并移除顶层的object、type字段。最终传递给Hasura的变量格式如下:
{ "created_at": 1654012591514, "first_name": "Example", "user_id": "user_29w83sxmDNGwOuEthce5gg56FcC", "updated_at": 1654012591835, "profile_image_url": "https://www.gravatar.com/avatar?d=mp" }
处理后,你最初编写的任意一个mutation都能正常执行。
方案2:在Hasura中定义接受完整Clerk事件的自定义Mutation
创建适配Clerk事件结构的mutation,手动提取所需字段:
- 在Hasura控制台Data > Custom Types中创建
clerk_event_input输入类型,匹配Clerk事件的核心结构(至少包含data字段及其中的必要子字段)。 - 编写对应的mutation:
mutation CreateUserFromClerkEvent($event: clerk_event_input!) { insert_users_one(object: { created_at: $event.data.created_at, first_name: $event.data.first_name, user_id: $event.data.id, updated_at: $event.data.updated_at, profile_image_url: $event.data.profile_image_url }) { created_at first_name user_id updated_at profile_image_url } }
此方案让Hasura能识别完整的Clerk事件变量,避免校验报错。
方案3:使用Hasura Request Transform(仅Cloud/Enterprise版本)
通过Hasura的请求转换功能自动修改Clerk的payload:
- 进入Hasura控制台Endpoints > Request Transforms,选择目标端点。
- 设置Body转换规则,用JSONPath提取所需字段:
{ "query": "{{$.query}}", "variables": { "created_at": "{{$.variables.data.created_at}}", "first_name": "{{$.variables.data.first_name}}", "user_id": "{{$.variables.data.id}}", "updated_at": "{{$.variables.data.updated_at}}", "profile_image_url": "{{$.variables.data.profile_image_url}}" } }
该转换会自动将Clerk的原始payload转换成你第一个mutation所需的变量格式。
内容的提问来源于stack exchange,提问作者Matsyui
相关产品推荐
相关产品推荐

