.NET GraphQL如何拦截获取Query Schema校验的错误JSON对象
.NET GraphQL后端获取验证错误对象的实现方案
你可以通过以下两种方式拿到字段不存在这类验证错误,满足日志记录、字段合法性校验的需求:
方案一:使用错误过滤器(最常用,适配所有执行/验证阶段错误)
GraphQL.NET 以及主流的 .NET GraphQL 库(如Hot Chocolate)都提供了 IErrorFilter 接口,所有返回给前端的错误都会经过该过滤器的处理,你可以在这里直接拿到完整的错误对象。
实现步骤
- 自定义错误过滤器实现
IErrorFilter接口
using GraphQL; using GraphQL.Types; using Microsoft.Extensions.Logging; public class CustomErrorFilter : IErrorFilter { private readonly ILogger<CustomErrorFilter> _logger; public CustomErrorFilter(ILogger<CustomErrorFilter> logger) { _logger = logger; } public Error OnError(Error error) { // 可直接获取错误的所有属性,和返回给前端的JSON字段完全对应 if (error.Code == "FIELDS_ON_CORRECT_TYPE") { // 执行日志记录逻辑 _logger.LogWarning( "检测到非法查询字段,错误信息:{Message},错误位置:{Locations},查询路径:{Path}", error.Message, error.Locations, error.Path ); // 也可以自定义修改返回给前端的错误内容 return error with { Message = "请求包含不支持的查询字段,请检查参数" }; } // 其他类型错误直接返回 return error; } }
- 在服务注册时注入过滤器
// Program.cs 中添加配置 builder.Services.AddGraphQL() .AddErrorFilter<CustomErrorFilter>() // 保留你原有其他GraphQL配置即可 ;
方案二:自定义验证规则(提前拦截,在执行查询前校验字段合法性)
如果你需要在查询执行前就校验字段合法性、拦截非法请求,可以自定义查询验证规则,在验证阶段就拿到非法字段的相关信息。
using GraphQL.Validation; using GraphQLParser.AST; public class FieldValidityRule : IValidationRule { public ValueTask<INodeVisitor?> ValidateAsync(ValidationContext context) { var visitor = new NodeVisitors( new MatchingNodeVisitor<GraphQLField>((field, ctx) => { var parentType = ctx.TypeInfo.GetParentType(); if (parentType == null) return; var fieldName = field.Name.StringValue; // 校验字段是否在对应类型上存在 if (parentType.GetField(fieldName) == null) { // 此处可直接记录日志、抛出自定义异常 ctx.ReportError(new Error( $"字段{fieldName}在类型{parentType.Name}上不存在", field )); } }) ); return new ValueTask<INodeVisitor?>(visitor); } }
注册验证规则:
builder.Services.AddGraphQL() .AddValidationRule<FieldValidityRule>() ;
补充说明
如果你需要拿到和前端返回完全一致的错误JSON字符串,直接序列化 Error 对象即可,Error 类的所有公开属性和返回JSON的字段一一对应。
内容的提问来源于stack exchange,提问作者Jordan Ferr
相关产品推荐
相关产品推荐

