GraphQL 查询中两个字段的值需要一致的解决方案

在GraphQL查询中,我们常常需要查询两个字段的值是否一致,比如查询用户信息时需要同时获取用户的nickname和username,但又要保证这两个字段的值相同。本文将介绍一些解决方案。

方案一:使用断言函数

GraphQL查询中提供了一种断言函数(assertion function),可以用来执行任意的JavaScript代码,并根据运行结果决定是否继续查询。我们可以使用该函数来判断两个字段的值是否相等。例如,

----- -
  ---- -
    --------
    -------- -------------- ------------- --- --------------
  -
-

这里,我们使用了GraphQL变量来引用nickname和username,然后使用断言函数来判断它们的值是否相等。如果相等,就继续查询username字段,否则返回null。

使用该方法的好处是可以保证在服务器端执行代码,因此可以避免客户端篡改数据的风险,但缺点是需要对查询结构进行嵌套,并且需要客户端自己实现断言函数。

方案二:使用GraphQL的服务端扩展

另一种方式是使用GraphQL的服务端扩展功能。可以在GraphQL服务端中定义一个扩展类型(extension),在该类型中定义一个resolver来判断两个字段的值是否相等。例如,

------ ---- ---- -
  --------- ------ -------------- -----------
-

这里,我们使用了自定义的equals指令,该指令可以指定一个字段名,然后在GraphQL服务端中根据该名字获取对应字段的值,并判断它们是否相等。这种方法的好处是可以完全在服务端实现,缺点是需要修改GraphQL服务端的代码。

方案三:在GraphQL查询中使用inline fragment

最后,我们可以使用GraphQL查询的inline fragment功能来实现类似的需求。可以使用inline fragment 来判断两个字段的值是否相等,例如,

----- -
  ---- -
    --- -- ---- ------------ ------------- --- -------------- -
      --------
      --------
    -
  -
-

这里,我们使用了GraphQL的inline fragment功能,根据条件判断是否查询nickname和username字段。如果条件成立,就返回两个字段的值,否则返回null。此方法可读性较差,缺点是不能直接使用查询变量。

结论

这篇文章介绍了三种在GraphQL查询中判断两个字段的值是否相等的方法。每一种方法都有自己的优缺点,可以根据自己的需求选择最合适的方法。

-----
---- ----- -
  -------- ----- ----
-

---- ---- -
  --- ---
  --------- -------
  --------- -------
  
  --------- ------ -------------- -----------
-
------ - ----------------- ----------------- - ---- ----------

----- --------------- - --- ------------------
    ----- ---------
    ----- -
        ------ -
            ----- --------------
        --
    --
    ---------- -------------------------------------
    ------------- ------
    ------------ ------- ---- - ----- -- ----- -- ------- --------
    -------- -------- ----- -------- ----- -- -
        ----- - ----- - - -----
        ----- - --------- - - -----
        -- -------------- --- ------------------ -
            ------ -----
        -
        ------ ------------------
    --
---

----- ------ - ----------------------
    ---------
    ----------
    ----------------- -
        ------- ----------------
    --
---

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6718adf6ad1e889fe22d5290