如何在 GraphQL 中强制执行枚举验证

GraphQL 作为一种查询语言,具有强大而灵活的查询功能,但是在开发过程中,为了保证数据的准确性和安全性,我们需要对用户提交的参数进行验证,特别是当参数只能是特定值中的一个时,使用 GraphQL 的枚举类型来限制参数类型非常方便,那么,在 GraphQL 中如何强制执行枚举验证呢?

枚举类型简介

枚举类型(Enum)是一种数据类型,用于定义一组有限的常数。在 GraphQL 中,枚举类型用于表示只能是特定值中的一个参数。比如,考虑下面这个查询:

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

这个查询中的 OrderStatus 是一个枚举类型,它能够限制参数 status 只能是 NEW, PROCESSINGCOMPLETED 中的一个值。

在 GraphQL 的 Schema 中定义枚举类型和普通类型一样。比如,定义一个名为 OrderStatus 的枚举类型:

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

强制执行枚举验证

默认情况下,GraphQL 不会强制执行枚举类型的验证,也就是说,如果客户端提交了一个不在枚举类型中的值,GraphQL 也会返回查询结果。比如,如果客户端提交了一个无效的 OrderStatus 值,GraphQL 会返回下面的结果:

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

为了强制执行枚举验证,在 GraphQL 的 Schema 中,需要定义一个自定义的 Scalar 类型来代替默认的 String 类型。比如,定义名为 EnumValueScalar 类型:

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

在 Resolver 中,使用 EnumValue 类型作为参数类型,处理参数时需要对客户端提交的参数进行验证,只有当参数是枚举类型中的一个值时才返回真正的查询结果。比如,定义名为 order 的 Resolver:

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

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

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

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

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

现在,如果客户端提交了一个无效的 OrderStatus 值,GraphQL 会返回下面的结果:

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

这个错误信息准确地告诉客户端提交了无效的值,让客户端能够快速定位问题并进行修复。

总结

在 GraphQL 中强制执行枚举验证,需要重新定义一个 Scalar 类型来代替默认的 String 类型,并在 Resolver 中对客户端提交的参数进行验证。通过这种方式,我们能够保证数据的准确性和安全性,让客户端能够快速定位问题并进行修复。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/646f1e36968c7c53b0d838c3


猜你喜欢

  • Webpack 实现图片压缩和雪碧图优化

    Webpack 是一个现代化的 JavaScript 应用程序构建工具,它可以将多个 JavaScript 文件打包成一个 bundle,同时也支持多种资源的处理,包括 CSS、图片、字体等。

    1 年前
  • 构建自定义的 Custom Elements

    随着 Web 技术的发展,前端开发已经不再局限于传统的 HTML、CSS 和 JavaScript。现在,浏览器支持使用 Custom Elements API 构建自定义的 Web 组件,使得开发者...

    1 年前
  • Kubernetes 中的外部服务访问

    Kubernetes(简称 k8s)已经成为了云原生应用的标准管理平台之一,尤其是在分布式微服务的场景中,它可以帮助开发者自动化部署、扩缩容、负载均衡等操作,极大地简化了应用的管理。

    1 年前
  • Vue.js 如何解决打包后图片加载不出来的问题

    在开发过程中,我们经常需要引入图片资源,但是在打包后,有时候我们会发现这些图片无法加载出来。这是因为在打包之后,图片的路径会发生改变,我们需要使用 Vue.js 提供的一些方法来解决这个问题。

    1 年前
  • ES7新增支持ArrayBuffer详解

    ArrayBuffer是一种二进制数据类型,用于存储页面中任何类型的数据。ES7新增了对ArrayBuffer的新支持,使得开发者可以更加灵活地使用二进制数据类型。

    1 年前
  • 开发中如何使用 Babel

    Babel 是一个开源的 JavaScript 编译器,它能将高版本的 JavaScript 代码转换为可运行在低版本 JavaScript 引擎中的语法形式。这个工具在前端开发中极为常用,它可以让我...

    1 年前
  • ES6 中使用 Array.from 方法将类数组转换成数组

    在前端开发中,经常会遇到需要将类数组转换为数组的情况,比如 NodeList,HTMLCollection 等 DOM 元素集合。在 ES6 中,可以使用 Array.from() 方法来简便地完成数...

    1 年前
  • CSS Reset 的历史及其作用

    在前端开发中,CSS的重要性不言而喻。但是,每个浏览器都有其自己的默认样式,这往往会导致开发者的样式不一致,因此有了 CSS Reset。 什么是 CSS Reset? CSS Reset的主要目的是...

    1 年前
  • React 的 Props 和 State 之间的区别

    在 React 中,Props 和 State 是两个非常重要的概念。Props 代表着组件的属性,而 State 代表着组件的状态。它们之间的区别和联系是很重要的,本文将详细介绍。

    1 年前
  • 如何在 GraphQL 中定义查询别名

    GraphQL 是一种用于构建 API 的查询语言,它允许我们定义数据模型并使用查询来获取想要的数据。在 GraphQL 中,我们可以使用查询别名来指定查询结果的名称。

    1 年前
  • ECMAScript 2021 “destructure” 的全面阅读指南

    简介 ECMAScript 2021 中的“destructure”(解构)语法是一种方便的语法,可以让开发人员更加轻松和灵活地处理复杂的数据结构。它可以拆解对象和数组,并将它们的属性或元素分配给变量...

    1 年前
  • Docker Compose:使用外部服务共享 SSL 证书

    在现代 Web 开发中,许多应用程序需要 SSL 证书以加密和保护用户数据。而 Docker Compose 是一种强大的工具,可以简化多个 Docker 容器的管理和协调。

    1 年前
  • 如何让你的设计适应不同的身体类型

    你是否经常遇到这样的情况:不同体型的用户使用同一个界面,看起来效果却不相同,甚至出现超出屏幕或者错位等问题?那么这篇文章将会为你提供一个前端设计的解决方案,让你的界面能够适应不同的身体类型,让用户们都...

    1 年前
  • 基于 Angular 和 Socket.io 实现实时聊天应用的思路与具体实现

    本文将介绍如何基于 Angular 和 Socket.io 实现一个实时聊天应用。实时聊天是一个非常常见的应用场景,通过学习本文,您将了解实时聊天应用的基本思路和具体实现方式。

    1 年前
  • ES8 中 Map 和 WeakMap 方法的应用

    在前端开发中,处理数据集合时常常使用数组、对象等数据结构。然而,在某些情况下,这些结构并不足够灵活,比如需要进行键值对的存取时,就会显得有些力不从心。这时候,就需要用到 ES8 中引入的 Map 和 ...

    1 年前
  • Angular + RxJS:如何减少模板中的管道操作

    在 Angular 中,使用管道对数据进行转换和格式化是非常常见的操作。虽然管道能够方便地解决一些问题,但是在模板中过多地使用管道也会导致性能下降和代码维护难度增加。

    1 年前
  • Flexbox 布局实例 —— 包含混排元素的解决方案

    在前端开发中,Web 布局是关键的一部分。Flexbox(弹性盒子)是一种当前流行的 CSS 布局方法,它能够使得我们更加轻松地实现复杂的布局效果,尤其是针对包含混排元素的情况。

    1 年前
  • 如何使用 Express.js 和 PostgreSQL 构建 RESTful API

    在前端开发中,构建 RESTful API 是一项必不可少的任务。而 Express.js 和 PostgreSQL 是两个常用的开发工具。在本文中,我将介绍使用 Express.js 和 Postg...

    1 年前
  • 使用 Chai-HTTP 代替 Superagent 进行 Node.js API 测试的方法

    在进行 Node.js API 测试时,我们通常使用 Superagent 这个库进行 HTTP 请求和断言。然而,Superagent 的 API 设计相对较为复杂,使用起来有一定的学习曲线,难以快...

    1 年前
  • Web Components 中 LitElement 如何实现服务端渲染

    Web Components 是一种前端技术标准,它可以让开发人员创建可复用的自定义 HTML 元素,以及使用这些元素来构建更加容易维护和可扩展的 Web 应用程序。

    1 年前

相关推荐

    暂无文章