GraphQL 是一种由 Facebook 开发的数据查询和修改语言,它可以更加高效和灵活地查询和修改数据。在前端项目中,GraphQL 可以提供数据查询和修改的功能,并且通过将验证逻辑集成到 GraphQL Schema 中,可以实现数据验证的目的。本文将介绍如何使用 GraphQL 进行数据验证,并解决常见问题。
GraphQL 简介
GraphQL 是一种查询语言,它的主要特点有:
灵活:通过 GraphQL 查询语句可以精确地指定需要查询的数据,可以避免传统 RESTful 接口中的“过度传输”问题。
高效:GraphQL 可以减少不必要的网络请求,通过单一的 API 可以解决多个数据源的访问问题。
安全:可以将验证操作集成到 GraphQL Schema 中,避免不可预测的行为。
GraphQL 的核心是查询语言(Query Language)和类型系统(Type System)。类型系统定义了一个 GraphQL Schema,可以控制执行时的查询类型和对数据进行验证的方式。
GraphQL 数据验证
对于任何 Web 应用程序,数据验证都是至关重要的。GraphQL 提供了在 Schema 级别上执行验证操作的机制,这为应用程序开发者带来了很大的便利。下面介绍 GraphQL 数据验证的两个主要方面:
输入类型检验
在 GraphQL 中,所有参数都是作为输入类型传递的,即使您在输入多个参数时,它们仍然被视为单个类型。这使得输入类型在 GraphQL 中非常重要。如果某个输入参数的类型不符合预期,则 GraphQL 会自动拒绝该请求。
例如,假设我们有一个 GraphQL 查询:
query getUserById($id: ID!) { user(id: $id) { id name } }
在这个查询中,我们期望 $id 参数是一个 ID 类型的值。如果我们传递了一个字符串,GraphQL 会自动拒绝该请求,并返回以下错误:
{ "errors": [ { "message": "Variable \"$id\" got invalid value \"abc\"; Expected type ID; ID cannot represent value: \"abc\"" } ] }
为了解决这个问题,我们可以在类型定义中添加一个输入类型的约束条件:
-- -------------------- ---- ------- ----- --------- - --- --- ----- ------- - ---- ----- - ----------- ----------- ---- - ---- ---- - --- --- ----- ------- -
这个约束条件定义了一个名为 UserInput 的输入类型,该类型包含 id 和 name 两个属性。这个约束条件还要求 id 和 name 属性都不能为空。
数据验证
GraphQL Schema 除了是数据源的映射之外,还可以定义数据的验证规则。可以在 Schema 中使用自定义的验证程序来实现数据验证,并在查询和传递数据之前对数据进行验证。这样可以确保向数据库添加统一的数据。以下是一个示例:
-- -------------------- ---- ------- ----- ------------ - ----- ------- ---- ---- - ---- -------- - -------------- -------------- ---- - ---- ---- - --- --- ----- ------- ---- ---- - ----- --------------- - --- --- ----- ------ ---- --- - ---- -------- - ----------------- ----------------- ---- - ----- --------------- - --- --- - ---- -------- - ----------------- ----------------- ------- - ---- ------ - ---- ------ - ---- ----- - -------- ----- ---- ----------- ------- ---- ---- ------- -------- ------ - ----- --------------- - ----- ---- ------ ---- - ---- -------- - ----------- ---- ----------- ---- ------------ ---- --------- --- --------- --- - ---- -------------- - --------- --------- ------ ------------ - ---- -------- - ----- ----- ------- ------- - ---- ----- - ---------------------- ----------------- -------------- -
以上的例子给出了一些数据获取和修改的操作和验证。例如,在 AddUserInput 中,使用了约束条件来验证添加用户的输入信息,UpdateUserInput 和 DeleteUserInput 也有相应的验证。
常见问题解决
在使用 GraphQL 进行数据验证的过程中,会遇到一些常见问题。下面我们会介绍这些问题并提供相应的解决方案。
如何收集验证错误
例如,在添加用户时,可能会出现以下错误:
{ "errors": [ { "message": "Variable \"$input\" got invalid value {\"age\":\"2\", \"name\":false}; Field value.age of required type Int! was not provided." } ] }
为了更好地理解检查到的错误,应将其收集在一个数组中,然后返回到请求中。下面的代码片段演示了如何在 GraphQL 中捕获错误和收集错误的方法。
-- -------------------- ---- ------- ----- - -------------- - - ------------------------- -- --- ----- -------- ---------- - ----- -- - ----------- -- - ----- ---- - -------------------------------------- -- ------- - ----- --- ---------------------- ------ ---- ---- ------ - - ----------------------- - ------ ----- -
这个例子中的 addUser 函数检查输入参数,并在创建新用户时发生错误时抛出 UserInputError 异常。在这种情况下,输入参数不能包含有效的 id 值。
如何执行异步验证
在某些情况下,数据验证可能需要异步执行。在这种情况下,可以使用 GraphQL 的托管程序机制。
以下代码片段演示在 GraphQL 中处理异步验证的示例:
-- -------------------- ---- ------- ----- -------- ---------- - ----- -- - ----------- -- - ----- ------ - ----- ------------------------------------------- -- --------- - ----- --- ---------------------- ------ ---- ---- ------ - - ----------------------- - ------ ---------------------------------------- - -- --- ----- --------- - - --------- - -------- ------------------ -- --
在这个例子中,addUser 函数异步调用 dataSources.userAPI.createUser(input) 并返回 userId。在没有 userId 的情况下,用户将抛出 UserInputError 异常。
如何验证嵌套对象
在 GraphQL 中,嵌套对象是常见的结构。可以使用 GraphQL 的类型系统来轻松地验证嵌套对象。
-- -------------------- ---- ------- ----- ------------ - ------- ------- ----- ------- ------ ------- ---- ------- - ----- ------------- - ---------- ------- --------- ------- ------ ------- -------- ------------- - ---- -------- - --- --- ---------- ------- --------- ------- ------ ------- -------- -------- - ---- ----- - ---------------- ----- --------- - ---- -------- - ------------------ ---------------- --------- --------------------- ---------------- --------- ------------------ ----- -------- -
在这个例子中,嵌套的 AddressInput 与 CustomerInput 和 Customer 都简单地验证了它们所需要的所有属性。在 addCustomer 和 updateCustomer 函数中,可以对嵌套对象进行相同的验证。如果值不合法,可以抛出 UserInputError 异常来中断执行。
结论
GraphQL 提供了一种高效、灵活和安全的数据查询和修改方式,并通过将数据验证集成到表彰级别,帮助应用程序开发者更好地管理数据。在进行前端开发时,我们可以考虑使用 GraphQL,并结合上述技巧实现数据验证。
以上就是使用 GraphQL 进行数据验证及解决常见问题的详细介绍,希望对您有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/672c932bddd3a70eb6d8b834