所以我最近一直在玩热巧克力,我做了一个课程,给我一份学生名单,但我想为它提供一些验证功能。我在热巧克力官方网站上没有找到任何对我有帮助的东西。
学生.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);
}
}
现在我的问题是,我如何为学生制定验证规则,例如说一个学生的名字必须至少有3个字符?有人能给我举个例子吗?
提前谢谢。
HotChocolate本身没有集成此类输入验证。该框架只进行GraphQL验证。因此,检查无效的GraphQL查询。(例如错误类型(
如果你想使用验证,有几个社区库可供选择:
- AppAny.HotChocolate.FluentValidation-输入字段HotChocolate+FluentValidation集成
- DataAnnotatedModelValidations-HotChocolate的数据注释模型验证中间件
- FairyBread-HotChocolate的输入验证(FluentValidation(
- FluentChoco-用于HotChocolate的FluentValidation中间件
- Graph.ArgumentValidator-将输入参数验证添加到HotChocolate(DataAnnotations(
此处列出了社区库: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;
}
}
现在,您的模型需要实现IValidable,如下面的
public class Test : IValidatable
{
IEnumerable<string> Validate()
{
// Validate and return any validation errors here.
}
}
现在我们只需要注册
services.AddGraphQLServer().
UseField<OutputValidationMiddleware>()