处理 GraphQL 中操作重复的问题

阅读时长 4 分钟读完

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

纠错
反馈