使用Hot Chocolate和.NET 6构建GraphQL应用(9) —— 实现Mutate更新数据
系列导航
使用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更新数据的更多相关文章
- 使用Hot Chocolate和.NET 6构建GraphQL应用(8) —— 实现Mutate添加数据
系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 在讨论完GraphQL中的查询需求后,这篇文章我们将演示如何实现GraphQL中的数据添加任务. 思路 在G ...
- 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引
系列背景 在进入微服务的实践系列之前,我们一起来学习和实践一下.NET应用开发生态中一些比较重要的技术,这个系列就是关于GraphQL在.NET 6应用中的实现. 系列导航 使用Hot Chocola ...
- 使用Hot Chocolate和.NET 6构建GraphQL应用(1)——GraphQL及示例项目介绍
系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 前言 这篇文章是这个系列的第一篇,我们会简单地讨论一下GraphQL,然后介绍一下这个系列将会使用的示例项目. 关 ...
- 使用Hot Chocolate和.NET 6构建GraphQL应用(2) —— 实体相关功能实现
系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 在本文中,我们将会准备好用于实现GraphQL接口所依赖的底层数据,为下一篇文章具体实现GraphQL接口做 ...
- 使用Hot Chocolate和.NET 6构建GraphQL应用(3) —— 实现Query基础功能
系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 在本文中,我们通过一个简单的例子来看一下如何实现一个最简单的GraphQL的接口. 实现 引入Hot Cho ...
- 使用Hot Chocolate和.NET 6构建GraphQL应用(4) —— 实现Query映射功能
系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 在上一篇文章使用Hot Chocolate和.NET 6构建GraphQL应用(3) -- 实现Query基 ...
- 使用Hot Chocolate和.NET 6构建GraphQL应用(5) —— 实现Query过滤功能
系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 对于查询来说,还有一大需求是针对查询的数据进行过滤,本篇文章我们准备实现GraphQL中基本的查询过滤. 思 ...
- 使用Hot Chocolate和.NET 6构建GraphQL应用(6) —— 实现Query排序功能
系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 从前几篇文章可以看出,使用Hot Chocolate实现GraphQL接口是比较简单的,本篇文章我们继续查询 ...
- 使用Hot Chocolate和.NET 6构建GraphQL应用(7) —— 实现Query分页功能
系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 GraphQL中的查询分页相对来说是查询中比较难理解的,接口的Schema也和其他不一样.在这篇文章中,我们 ...
随机推荐
- 【Java】多线程入门
Java多线程学习(入门) 前言 目前对于线程的了解仅仅停留在学习python的threading库,很多线程的概念没有真正弄清楚,所以选择来系统性的学习多线程.那么这次选择的是Java的多线程学习, ...
- 1013day-人口普查系统
1.shuchu.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- 计算机视觉3-> yolov5目标检测1 |从入门到出土
本来就想着是对自己第一次跑yolov5的coco128的一个记录,没想到现在准备总结一下的时候,一方面是继续学习了一些,另一方面是学长的一些任务的要求,挖出了更多的东西,所以把名字改为了"从 ...
- vector自实现(一)
vector.h: #ifndef __Vector__H__ #define __Vector__H__ typedef int Rank; #define DEFAULT_CAPACITY 3 t ...
- gin中设置和获取cookie
package main import ( "fmt" "github.com/gin-gonic/gin" ) func main() { router := ...
- insert语句
7.4.插入数据insert(DML语句) 语法格式: insert into 表名(字段名1,字段名2,字段名3...) values(值1,值2,值3): 注意:字段名和值要一一对应.什么是一一对 ...
- JavaScript如何实现上拉加载,下拉刷新?
转载地址: 面试官:JavaScript如何实现上拉加载,下拉刷新? 一.前言 下拉刷新和上拉加载这两种交互方式通常出现在移动端中 本质上等同于PC网页中的分页,只是交互形式不同 开源社区也有很多优秀 ...
- CPU飙升排查
怎么排查CPU飙升 线上有些系统,本来跑的好好的,突然有一天就会出现报警,CPU使用率飙升,然后重启之后就好了.例如,多线程操作一个线程不安全的list往往就会出现这种现象.那么怎么定位到具体的代码范 ...
- springboot 修改关闭banner的方法
一.修改banner. 1.1 替换banner: 需要在resources(classpath)目录中创建文件 banner.txt 1.2 上图 banner.txt 里面可以使用文字,也可以 ...
- Windows下cmd/powershell命令混淆绕过
前言 在Windows下绕过杀毒软件的主动防御机制的常见思路. Bypass 1.特殊符号.大小写 常用符号: " ^ , ; 可以绕过一些常规的waf 2.环境变量 拿到一台机器时,可以先 ...