所以我最近一直在玩 Hotchocolate,我做了一个类,它给了我一个学生列表,但我想有一些验证功能。我在热巧克力官方网站上并没有真正找到任何对我有帮助的东西。
学生.cs
public class Student
{
[GraphQLNonNullType]
public string Name{ get; set; }
[GraphQLNonNullType]
public string LastName{ get; set; }
[GraphQLNonNullType]
public string Picture { get; set; }
}
这是我的查询,目前返回列表中的所有学生。
StudentQuery.cs
public class StudentQuery
{
[UseFiltering]
[UseSorting]
public List<Student> GetStudents()
{
return MongoDBHelper.LoadRecords<Student>(EMongoCollection.Students);
}
}
现在我的问题是,如何为学生制定一个 ValidationRule,例如说学生的名字必须至少有 3 个字符? 有人可以给我提供一些例子吗?
提前致谢。
HotChocolate 本身没有集成此类输入验证。 该框架仅进行 GraphQL 验证。因此检查无效的 GraphQL 查询。 (例如类型错误)
如果您想使用验证,有一些社区库可供选择:
此处列出了社区图书馆: https://github.com/ChilliCream/hotchocolate/blob/main/COMMUNITY.md
除了第三方库..我们可以编写一个自定义中间件来处理从服务输出的数据的数据验证...
中间件示例代码
public class OutputValidationMiddleware
{
private readonly FieldDelegate next;
private readonly ILogger<OutputValidationMiddleware> logger;
public OutputValidationMiddleware(
FieldDelegate next,
ILogger<OutputValidationMiddleware> logger)
{
this.next = next;
this.logger = logger;
}
public async Task InvokeAsync(IMiddlewareContext context)
{
await next(context).ConfigureAwait(false);
if (context.Result != null && context.Result is IValidatable)
{
var validationErrors = (context.Result as IValidatable).Validate();
foreach (var err in validationErrors)
{
logger.LogWarning(err);
}
}
return;
}
}
现在您的模型需要实现如下所示的 IValidatable
public class Test : IValidatable
{
IEnumerable<string> Validate()
{
// Validate and return any validation errors here.
}
}
现在我们只需注册即可
services.AddGraphQLServer().
UseField<OutputValidationMiddleware>()
我在 GraphQL 应用程序中使用 DataAnnotatedModelValidations 包 我已经分享了我的程序的一部分。cs
builder.Services
.AddGraphQLServer()
.AddDataAnnotationsValidator()
.
.
.
var app = builder.Build();
app.UseAuthentication();
app.UseAuthorization();
app.MapGraphQL("/");
我的问题是每次执行突变时验证过程都优先于授权。 因此,如果我使用无效输入执行突变且未经所需许可,预期行为将是出现未经授权的错误,但我得到了验证错误列表。 当我验证输入并再次运行时,出现未经授权的错误。
有没有办法让授权流程优先? 如果没有所需的权限,API 必须返回“用户未授权...”,即使输入充满错误。
有解决办法吗?