用 GraphQL 时如何在后端对查询进行验证?

GraphQL 是一个强类型的数据查询语言,通过定义查询和返回的类型来使得 API 更加精确和可预测。在前端开发过程中,我们常常会使用 GraphQL 来进行数据查询和操作。然而,为了确保系统的安全性和稳定性,在后端也需要对 GraphQL 查询进行验证。

在本文中,我们将介绍在后端如何对 GraphQL 查询进行验证,包括对查询结构和用户权限的验证。我们还将提供示例代码和实际应用的指导意义。

验证查询结构

验证查询结构是一种确保查询语句按照规定的方式进行的方法。通过验证查询结构,我们可以确保查询语句请求的数据满足定义的类型要求并且不能请求不支持的操作。

我们可以使用 GraphQL 的 schema 来定义类型和查询结构,然后使用一些工具来验证查询语句的结构。比如,如果我们定义了 Person 类型和一个查询所有人的操作,则验证代码可以采用如下方式:

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

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

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

在上面的代码中,我们定义了 Person 类型和一个查询所有人的操作,然后在 validateQuery 函数中使用 gql.validate 方法来验证查询语句。如果语句不合法,则会抛出错误并终止查询,反之则返回查询结果。

验证用户权限

验证用户权限是一种确保用户只能请求自己有权限的数据的方法。一般来说,我们可以在用户登录时获取用户的身份信息(比如角色、权限等),然后在查询时根据身份信息来决定是否返回数据。

我们可以将用户身份信息加入查询上下文中,然后在 resolver 中读取上下文信息,并根据用户权限进行过滤。比如,如果我们需要查询一个需要权限的资源列表:

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

在上面的代码中,我们将用户身份信息加入查询上下文中,然后在 resolver 中读取上下文信息,并且判断用户是否有权限访问资源。如果用户没有访问权限,则会抛出错误并终止查询,反之则返回查询结果。

结论

在本文中,我们介绍了在后端如何对 GraphQL 查询进行验证,包括对查询结构和用户权限的验证。在实际应用中,我们应该根据系统需求和查询类型来采用不同的验证方式,并且为查询错误提供友好的错误信息。通过这种方式,可以确保数据的安全性和可用性,同时提高系统的稳定性和易用性。

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


猜你喜欢

  • 响应式设计的视频制作技巧

    随着移动设备和多种屏幕尺寸的普及,响应式设计已经成为了现代网络设计的重要组成部分。在创作响应式视频时,我们需要特别注意实现技巧,以确保视频在各种屏幕尺寸下都能表现良好。

    8 天前
  • Hapi.js 中使用 Wreck:处理 HTTP 请求

    在编写任何 Web 应用程序时,HTTP 请求都是非常重要的一部分。无论您使用哪种语言或框架,都需要有一种方法来处理请求和响应。在 Hapi.js 中,我们使用 Wreck 模块来处理 HTTP 请求...

    8 天前
  • 意想不到的 GraphQL - 貌似很玄妙的一些操作

    GraphQL 是一种新兴的数据查询语言,它的出现已经彻底颠覆了前端开发者对数据来源的认识,使得开发者只需通过简单的 API 调用就能访问到所需要的数据。GraphQL 在前端开发中的应用非常广泛,以...

    8 天前
  • 聊聊 JS 异步编程 (四)—— 异步迭代器和 for-await-of

    在 JavaScript 中,我们经常需要处理大量异步操作。在上一篇文章中,我们讨论了 Promise 的使用和优化。在本篇文章中,我们将介绍异步迭代器和 for-await-of 循环,它们可以帮助...

    8 天前
  • 如何在 Deno 中使用 Puppeteer 进行网页截图和自动化测试

    Puppeteer 是一个由 Google 开源的用于控制 Chrome 或 Chromium 浏览器的 Node.js 库。它可以用于进行网页截图、测试、爬虫等操作。

    8 天前
  • 解决 Socket.io 连接过程中的跨域问题

    在前端开发中,Socket.io 是一款非常常用的实时通信工具,但是在使用时也会面临一些问题,其中跨域问题是比较常见的。本文将详细介绍在使用 Socket.io 连接时的跨域问题以及解决方法。

    8 天前
  • Angular2 SPA 应用周边技术栈比较

    在前端开发中,单页面应用 (SPA) 已成为一种常见的应用程序架构,Angular2 作为一种流行的前端框架,已经成为了一个SPA开发的重要工具。但是,Angular2 描述的程序架构仅仅是应用的骨架...

    8 天前
  • SASS 中选择器嵌套过深的问题与解决方法

    在前端开发中,CSS 是一项非常重要的技能。而作为 CSS 扩展语言的 SASS,可以帮助前端开发者更好地管理和组织样式。然而,在使用 SASS 的过程中,经常会遇到选择器嵌套过深的问题,这不仅影响代...

    8 天前
  • 在 React 组件中优雅地使用 Redux

    什么是 Redux? Redux 是一个流行的 JavaScript 应用程序状态管理库,它帮助你在你的应用程序中管理数据流。与其他状态管理库相比,Redux 使用了一个单一的全局状态树,这使得数据流...

    8 天前
  • 如何通过 Swagger UI 测试 RESTful API

    Swagger UI 是一款前端工具,用于测试和调试 RESTful API。它可以帮助开发者方便地测试 API,探索 API 文档,同时也可以为 API 文档提供可视化的呈现方式。

    8 天前
  • 通过 import.meta 认识 ES11 中的 JavaScript 模块

    介绍 ES11 中引入了一个新的对象 import.meta,它的作用是在 JavaScript 模块中提供了一些有用的元数据。 在之前的 ES6 标准中,JavaScript 模块可以通过 impo...

    8 天前
  • ECMAScript 2019 中 Symbol.toPrimitive 实现 valueOf 和 toString 的替代者

    ECMAScript 2019 中 Symbol.toPrimitive 实现 valueOf 和 toString 的替代者 在 ECMAScript 2019 中,Symbol.toPrimiti...

    8 天前
  • 前端响应式设计中图片 lazyload 的实现方法

    响应式设计是现代 Web 设计中的重要概念之一。它的主要目的是让网页在不同设备、不同浏览器和不同屏幕宽度下都能够自动适应,提供更好的用户体验。其中一个常常被忽视的方面是图片的加载和优化,尤其是在移动设...

    8 天前
  • 如何起步并完成一个最小的 Hapi.js 服务

    Hapi.js 是一个流行的 Node.js web 应用框架,它提供了丰富的功能,包括路由、请求处理、插件、参数校验等等。在本文中,我们将介绍如何使用 Hapi.js 来搭建一个最小的 web 服务...

    8 天前
  • 微服务框架:GraphQL vs REST vs 微服务

    随着Web应用的发展和需求变化,前端开发人员越来越多地使用微服务框架来构建高性能和可拓展的应用程序。在这篇文章中,我们将深入探讨三种流行的微服务框架:GraphQL、REST和微服务。

    8 天前
  • 如何在 Fastify 框架中使用 Handlebars 视图引擎

    Handlebars 是一个 JavaScript 模板引擎,可以帮助我们动态生成 HTML 页面,它的语法简单易懂,支持条件判断、循环等常用操作,受到了广泛应用。

    8 天前
  • 在 Deno 中如何使用 Jest 进行单元测试

    介绍 Deno 是一个 JavaScript 和 TypeScript 运行时环境,由 Node.js 的创建者 Ryan Dahl 打造。和 Node.js 不同,它内置 TypeScript 支持...

    8 天前
  • PWA 推送功能如何实现?

    PWA(Progressive Web App)是一种新型的 web 应用程序,具有类似于原生应用的功能和体验。其中一个重要的功能是推送通知功能,它能够让用户在离线状态下也能收到来自应用程序的提示,增...

    8 天前
  • Sequelize 中如何处理虚拟字段的使用

    在开发 Web 应用中,使用 ORM 框架来管理数据库非常方便。Sequelize 是一款流行的 Node.js ORM 框架,它可以支持多种数据库系统,如 MySQL、PostgreSQL、SQLi...

    8 天前
  • Next.js 中如何进行数据预取?

    Next.js 是一款用于构建 React 应用程序的框架,它提供了许多有用的功能,包括自动代码分割、服务端渲染、预取数据等。在本文中,我们将重点介绍在 Next.js 中如何进行数据预取。

    8 天前

相关推荐

    暂无文章