- GraphQL实战:写给全栈工程师们
- 王北南
- 589字
- 2025-03-01 05:50:31
2.4.2 可写修改操作
从Web 2.0时代开始,应用程序不仅要求客户端要从服务器端获取数据,同时也会要求客户端可以修改服务器端的数据。在GraphQL中,开发者把会修改数据的操作定义在schema的Mutation类型中。
需求 为迷你电商网站建立一个“下单”的功能,为了简单起见,不考虑用户登录以及权限控制,所有使用者都可以匿名下单。但为了让客户端可以在“下单”成功后方便地显示新订单的内容,“下单”操作需要返回新订单的数据。
和Query一样,在schema中也需要定义修改操作Mutation的入口。提供一个makeOrder的操作来完成“下单”的功能。代码如下:

Mutation的定义方式和Query完全一样,它也可以返回数据。在上面的代码示例中,每次对一个产品下单后,返回该产品的最新数据。请看接下来对“10001”号产品下单,并且返回新订单三个指定字段的具体例子:

下单后,得到返回如下:


通过上面的修改操作可以在服务器端得到最新的库存(inStock)信息,依据这个信息,可以方便地更新客户端应用中库存的显示。
有些读者或许会想,为什么要定义Mutation呢?这和Query的定义看起来也没有什么不同嘛,在处理Query的后端实现代码里写入数据不也是一样的吗?这是一个非常好的问题,单纯从GraphQL的前后端实现来说,并没有强制限定在Query中不能更改数据,所以的确可以在Query操作的后端实现中进行数据的写入操作,但这会造成若干问题。而且为了更好地优化前端界面更新,我们也乐于把Mutation从Query中分离出来。具体是什么原因,作者这里先卖一个关子,后面会有章节再来讨论Query和Mutation的问题。