系列导航

使用Hot Chocolate和.NET 6构建GraphQL应用文章索引

需求

在上一篇文章中,我们演示了如何使用Hot Chocolate进行GraphQL的Mutate新增数据,这篇文章我们将演示如何实现GraphQL中的数据更新任务。

思路

对数据的更新和新增数据的思路是一样的,都是使用Mutate机制进行更新。

实现

为了保持简单,我们先定义以下两个类型:

// 定义更新Post的参数
public record UpdatePostInput(Guid Id, string Title, string Author); // 定义新增Post的返回对象
public record UpdatePostPayload(Post Post);

新建Mutation.cs用来定义相关接口:

  • Mutation.cs
public async Task<UpdatePostPayload> UpdatePostAsync(UpdatePostInput input, [Service] IRepository<Post> repository)
{
var post = await repository.GetSingleAsync(p => p.Id == input.Id);
if (post == null)
{
throw new ArgumentException($"no post with id: {input.Id} can be found!");
} post.Title = input.Title;
post.Author = input.Author; return new UpdatePostPayload(await repository.UpdateAsync(post));
}

这样就实现了更新Post的需求,下面我们来验证一下。

验证

启动Api项目,先查询所有的Post数据:

接下来对其中一条Post进行更新:

终端的日志输出如下:

[15:44:17 INF] Executing endpoint 'Hot Chocolate GraphQL Pipeline'
[15:44:17 INF] Executed DbCommand (0ms) [Parameters=[@__input_Id_0='?' (DbType = Guid)], CommandType='Text', CommandTimeout='30']
SELECT "p"."Id", "p"."Abstraction", "p"."Author", "p"."Content", "p"."Created", "p"."CreatedBy", "p"."LastModified", "p"."LastModifiedBy", "p"."Link", "p"."PublishedAt", "p"."Title"
FROM "Posts" AS "p"
WHERE "p"."Id" = @__input_Id_0
LIMIT 1
[15:44:17 INF] Executed DbCommand (0ms) [Parameters=[@p10='?' (DbType = Guid), @p0='?' (Size = 66), @p1='?' (Size = 22), @p2='?' (Size = 30), @p3='?' (DbType = DateTime), @p4='?', @p5='?' (DbType = DateTime), @p6='?', @p7='?' (Size = 26), @p8='?' (DbType = DateTime), @p9='?' (Size = 59)], CommandType='Text', CommandTimeout='30']
UPDATE "Posts" SET "Abstraction" = @p0, "Author" = @p1, "Content" = @p2, "Created" = @p3, "CreatedBy" = @p4, "LastModified" = @p5, "LastModifiedBy" = @p6, "Link" = @p7, "PublishedAt" = @p8, "Title" = @p9
WHERE "Id" = @p10;
SELECT changes();
[15:44:17 INF] Executed endpoint 'Hot Chocolate GraphQL Pipeline'
[15:44:17 INF] Request finished HTTP/1.1 POST https://localhost:7194/graphql application/json 288 - 200 - application/json;+charset=utf-8 8.6091ms

再进行一次查询:

可以看到更新后的Post已经存储到数据库中了。

如果我们使用错误的Id去尝试更新数据,那么会得到这样的返回:

但是这样我们并不能看到具体的错误信息,即使我们在代码中已经明确throw了异常并填入了错误信息。接下来我们来解决这个问题。

扩展:自定义异常返回

为了让GraphQL的schema能够识别异常类型,最简单的方式是通过属性[Error(typeof())]来指定异常类型,我们当然可以穿入ArgumentException异常类型,为了演示如何自定义异常类型。我们新建一个异常类:

namespace PostGraphi.Api.GraphQL.Exceptions;

public class PostNotFoundException : Exception
{
public PostNotFoundException(Guid id)
: base($"no post with id: {id} can be found!")
{
}
}

并修改Mutate方法属性和抛出异常的代码:

[Error(typeof(PostNotFoundException))]
public async Task<UpdatePostPayload> UpdatePostAsync(UpdatePostInput input, [Service] IRepository<Post> repository)
{
var post = await repository.GetSingleAsync(p => p.Id == input.Id);
if (post == null)
{
throw new PostNotFoundException(input.Id);
}
post.Title = input.Title;
post.Author = input.Author;
return new UpdatePostPayload(await repository.UpdateAsync(post));
}

最后还需要在引入依赖的时候进行配置,选择返回结果中包含具体的错误信息:

builder.Services
.AddGraphQLServer()
// .....
.ModifyRequestOptions(opt => opt.IncludeExceptionDetails = true);

再来测试一下:

在extension中我们看到了自定义的错误信息输出。

总结

在本文中我们实现了简单的更新Post操作,对于删除数据来说,思路并没有区别,所以我们下一篇文章将会直接介绍GraphQL中的另一大特性:Subscription。

使用Hot Chocolate和.NET 6构建GraphQL应用(9) —— 实现Mutate更新数据的更多相关文章

  1. 使用Hot Chocolate和.NET 6构建GraphQL应用(8) —— 实现Mutate添加数据

    系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 在讨论完GraphQL中的查询需求后,这篇文章我们将演示如何实现GraphQL中的数据添加任务. 思路 在G ...

  2. 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引

    系列背景 在进入微服务的实践系列之前,我们一起来学习和实践一下.NET应用开发生态中一些比较重要的技术,这个系列就是关于GraphQL在.NET 6应用中的实现. 系列导航 使用Hot Chocola ...

  3. 使用Hot Chocolate和.NET 6构建GraphQL应用(1)——GraphQL及示例项目介绍

    系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 前言 这篇文章是这个系列的第一篇,我们会简单地讨论一下GraphQL,然后介绍一下这个系列将会使用的示例项目. 关 ...

  4. 使用Hot Chocolate和.NET 6构建GraphQL应用(2) —— 实体相关功能实现

    系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 在本文中,我们将会准备好用于实现GraphQL接口所依赖的底层数据,为下一篇文章具体实现GraphQL接口做 ...

  5. 使用Hot Chocolate和.NET 6构建GraphQL应用(3) —— 实现Query基础功能

    系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 在本文中,我们通过一个简单的例子来看一下如何实现一个最简单的GraphQL的接口. 实现 引入Hot Cho ...

  6. 使用Hot Chocolate和.NET 6构建GraphQL应用(4) —— 实现Query映射功能

    系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 在上一篇文章使用Hot Chocolate和.NET 6构建GraphQL应用(3) -- 实现Query基 ...

  7. 使用Hot Chocolate和.NET 6构建GraphQL应用(5) —— 实现Query过滤功能

    系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 对于查询来说,还有一大需求是针对查询的数据进行过滤,本篇文章我们准备实现GraphQL中基本的查询过滤. 思 ...

  8. 使用Hot Chocolate和.NET 6构建GraphQL应用(6) —— 实现Query排序功能

    系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 从前几篇文章可以看出,使用Hot Chocolate实现GraphQL接口是比较简单的,本篇文章我们继续查询 ...

  9. 使用Hot Chocolate和.NET 6构建GraphQL应用(7) —— 实现Query分页功能

    系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 GraphQL中的查询分页相对来说是查询中比较难理解的,接口的Schema也和其他不一样.在这篇文章中,我们 ...

随机推荐

  1. Microsoft Store 桌面应用发布流程(一)之打包应用

    这篇博客主要是介绍桌面应用打包的流程,应用发布流程请看 Microsoft Store 桌面应用发布流程(二)之提交应用 1. 创建打包项目 打开现有的桌面应用项目.选择解决方案项目,右键选择 添加新 ...

  2. go语言 strconv.ParseInt 的实现分析

    字符串与数值之间进行转换是一个高频操作,在go语言中,SDK提供 strconv.ParseInt 将字符串转换为数值,strconv.FormatInt 可以将数值转换为字符串. 1.首先看下 st ...

  3. 【代码分享】用redis+lua实现多个集合取交集并过滤,类似于: select key from set2 where key in (select key from set1) and value>=xxx

    redis中的zset结构可以看成一个个包含数值的集合,或者认为是一个关系数据库中用列存储方式存储的一列. 需求 假设我有这样一个数据筛选需求,用SQL表示为: select key from set ...

  4. Manacher算法求解回文字符串

    Manacher算法可以在\(O(N)\)时间内求解出一个字符串的所有回文子串(正反遍历相同的字串). 注:回文串显然有两种,一种是奇数长度,如abczcba,有一个中心字符z:另外一种是偶数个长度, ...

  5. Android Native -- Message/Handler/Looper机制(原理篇)

    ⌈Android Native消息队列处理系列文章⌋ Android Native -- Message/Handler/Looper机制(原理篇) Android Native -- Message ...

  6. 前端 | Vue nextTick 获取更新后的 DOM

    前两天在开发时遇到一个需求:打开对话框的时候自动聚焦其中的输入框.由于原生的 autofocus 属性不起作用,需要使用组件库提供的 focus 方法手动手动获取焦点.于是有如下代码: <el- ...

  7. ssh代理转发

    实验环境 serverA:172.16.2.116 serverB:172.16.2.225 serverC:172.16.2.115 "代理转发"是针对ssh认证过程的一种转发 ...

  8. linux中sort命令全面解析

    目录 一:sort命令作用 二:sort格式 1.sort参数 2.参数解析 sort命令简介 Linux sort 命令用于将文本文件内容加以排序. sort 可针对文本文件的内容,以行为单位来排序 ...

  9. Java虚拟机的意义

    什么是Java虚拟机? 作为程序员,大家都知道写的代码都是在Java虚拟机上运行的,但大家是否知道,Java虚拟机又是什么呢? 先看看网上搜到有关JAVA虚拟机的介绍 : 虚拟机是一种抽象化的计算机, ...

  10. Java 锁 概念介绍

    一   Java中的锁是什么? /* * 一 Java锁定义? * 在计算机科学中,锁(lock)或互斥(mutex)是一种同步机制,用于在有许多执行线程的环境中强制对资源的访问限制. * 锁旨在强制 ...