GraphQL 是一种数据查询和操作语言,它可以让客户端精确地请求所需的数据,从而避免了传统的 REST API 中出现的 over-fetching 和 under-fetching 问题。但在使用 GraphQL 进行数据查询和操作时,经常会遇到一个问题:重复的操作。
什么是操作重复?
在 GraphQL 中,操作可以被定义成一个 Query、Mutation 或 Subscription。当一个操作被多次触发时,就会造成操作重复的问题。例如:
-- -------------------- ---- ------- -------- - ----------------- - ------ ------- ------- -------- ----- -- -- ----- ------ -- - -- - - -------- - ----------------- - ------ ------- ------- -------- ----- -- -- ----- ------ -- - -- - -
在上面的代码中,我们对 createPost
进行了两次操作,并且传递的参数都是相同的。这意味着我们在数据库中创建了两个相同的帖子,而不是一个。
为什么会出现操作重复?
操作重复的问题通常在以下情况下发生:
- 客户端代码中出现了重复的操作。
- 服务端代码中出现了重复的操作。
这两种情况都会导致数据被重复操作,进而带来不必要的计算和资源消耗,甚至导致系统崩溃。
如何处理操作重复?
为了处理 GraphQL 中的操作重复问题,有以下几个建议:
1. 在客户端代码中进行去重
在前端中,可以在发送 GraphQL 请求之前进行本地的操作去重。你可以在客户端代码中使用缓存来记录已经操作过的数据,当用户再次对相同的数据进行操作时,直接返回缓存中的数据,而不是再向服务端发送请求。
-- -------------------- ---- ------- ----- ----- - --- ----- ----- -------- ----------------- -------- - ----- -------- - ---------------- ------ ------- -- -- --------------------- - ------ ------------------- - ----- ------ - ----- --------- -------- ------------------ ----------- - ----------------- ------- - -- - - -- - ------ - ------ ------- - -- ------------------- ------- ------ ------ -
在上面的代码中,我们使用了一个缓存 cache
来存储已经创建的帖子数据。对于重复的帖子,我们直接从缓存中返回已经创建的帖子数据,而不是再次向服务端发送请求。
2. 在服务端代码中进行去重
在后端,你可以使用一些技术来避免重复操作,例如:
- 使用数据库的唯一约束来保证数据的唯一性。
- 使用缓存来记录已经被处理过的数据,避免重复处理。
-- -------------------- ---- ------- ----- -------- ----------------- - ----- -------- - --------------------- ----- ---------- - ----- ------------------- -- ------------ - ------ ---------- - ----- ------ - ----- ---------- ------ ---- ---- ------- -------- ------ --- -- -- ------------- --------------- ----- ------ - --------------- ----- ---- - ----- ---------- ------ - ---- ---- ----- -- - - -- --------- ------------------- ----- ------ ---- -
在上面的代码中,我们使用了数据库的唯一约束来保证帖子数据的唯一性。如果数据库中已经存在相同的帖子,那么插入操作将会失败,我们直接返回已经存在的帖子数据。同时,我们也使用了缓存来存储已经被处理过的帖子,避免重复处理。
总结
GraphQL 中的操作重复问题会对系统带来不必要的计算和资源消耗,甚至导致系统崩溃。为了避免这个问题,我们可以在客户端或服务端进行去重操作,使得数据操作更加精确和高效。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f1a367f6b2d6eab3b760f7