GraphQL 框架在 Nginx 中跨域访问的问题解决

前言

GraphQL 是一种查询语言,用于 API 的查询接口,它的出现对前端开发者而言是一大利好,可以简化前端与后端的数据交互和处理。然而,当使用 GraphQL 框架进行开发时,前后端运行环境分属不同的域名,因此会在跨域方面存在一些问题。本文将介绍 GraphQL 框架在 Nginx 中跨域访问的问题以及解决方法。

问题描述

在跨域请求中,客户端请求的来源域名和服务端响应的地址不同,浏览器为了防止将客户端的资源发送至其他域名,会默认阻止所有跨域请求。当然我们可以通过在服务端设置响应头信息,允许指定的域名进行请求。但是在使用 GraphQL 框架时,会出现以下问题:

  1. GraphQL 的 schema 是运行在服务端的,因此客户端无法通过设置请求头中的 Origin 来进行跨域请求。

  2. GraphQL 框架默认使用 POST 方法发送请求,又由于各浏览器对于跨域请求的限制,造成在 Nginx 服务器中无法正常访问 GraphQL 接口。

这两个问题都会导致无法跨域请求 GraphQL 接口。我们来详细介绍一下如何解决这两个问题。

解决方法

问题一:无法设置 Origin 请求头

在请求头中添加 Origin 字段是浏览器默认的跨域请求方式,但是它的设置是受限的,因为 GraphQL 的 schema 是在服务端生成的,客户端无法通过修改请求头来进行跨域请求。

解决这个问题的方法就是在服务端设置响应头,在服务端接收请求之后,服务端在响应头中添加 Access-Control-Allow-Origin 字段,允许指定的源站进行跨域请求。在 Nginx 中可以使用 add_header 语句,在 NGINX 配置文件中添加如下信息:

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

这行配置允许任意源站进行跨域请求。如果你想指定哪些源站可以进行跨域请求,可以使用下面的配置:

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

在本例中,我们只允许 www.example.com 进行跨域请求。

问题二:POST 请求跨域问题

由于浏览器的限制,在跨域情况下使用 POST 请求可能会面临一些问题。Nginx 中,对于 POST/PUT/PATCH 请求的跨域问题缺省情况下会被禁止。在 GraphQL 中,由于它默认使用 POST 方法发送请求,这会导致不能正常访问接口。

解决这个问题的方法是修改 Nginx 的配置文件。在 Nginx 1.12 及以后版本中,可以使用如下化简的配置代码:

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

在实际使用中,以上配置是需要根据自己的实际需求来修改的。

示例代码

以下是一个示例代码,仅供参考:

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

总结

在 Nginx 中跨域访问 GraphQL 框架存在两个问题,一个是无法设置 Origin 请求头,另一个是 POST 请求跨域问题。针对这两个问题,本文提出了相应的解决方法,并给出了相应的示例代码。希望对大家有所帮助。

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


猜你喜欢

  • 如何使用 GraphQL 和 Prisma 实现后端 API

    在传统的后端 API 开发中,开发者需要自行编写数据库查询、定义数据类型及其关系以及 API 接口。而 GraphQL 和 Prisma 的出现,则可简化这 一过程。

    1 年前
  • 如何在 Next.js 中使用 TailwindCSS?

    介绍 TailwindCSS 是一个实用的 CSS 框架,旨在提高开发者的开发效率。它提供了一套可复用的样式,而不是提供大量的易变组件。使用 TailwindCSS 可以让我们更快地构建样式,同时保持...

    1 年前
  • PWA 应用的性能问题需要注意什么?

    什么是 PWA? PWA 即 Progressive Web App,是一种介于传统 Web 应用和本地应用之间的应用程序。PWA 可以为用户提供类似于本地应用的体验,包括离线访问、推送通知等。

    1 年前
  • Jest 报错:"Expected mock function not to have been called, but it was called." 的解决方法

    在使用 Jest 进行前端单元测试时,我们常常会遇到下面这样的报错信息: -------- ---- -------- --- -- ---- ---- ------- --- -- --- ----...

    1 年前
  • RESTful API 与 OAuth 2.0 集成实践

    什么是 RESTful API? RESTful API 是一种通过 HTTP 来访问和操作 Web 资源的 API 设计规范。REST 是 Representational State Transf...

    1 年前
  • Angular 导出 Excel 文件的方法

    背景 在实际的项目开发中,经常需要导出数据到 Excel 文件,例如导出 Excel 报表、导出数据备份等等。而在 Angular 框架中,我们可以通过使用本地 JavaScript 库 SheetJ...

    1 年前
  • 阅读 ECMAScript 2019 规范

    ECMAScript 是一种标准化的脚本语言,也是 Web 前端开发的基石之一。每年都会发布新版本的 ECMAScript 规范,而今年发布的是 ECMAScript 2019。

    1 年前
  • 如何用 Babel 编译 Meteor 应用程序

    在前端开发过程中,经常会用到 Meteor,它是一个 JavaScript 平台,能够让你快速地构建 Web 应用程序。但是,在一些情况下,你可能会需要将 ES6 或 TypeScript 代码转换为...

    1 年前
  • ECMAScript 2020:通过 Proxy 方法对对象进行审查

    ECMAScript 2020:通过 Proxy 方法对对象进行审查 在前端开发中,我们难免会遇到需要对对象进行审查的情况,例如判断某个属性是否存在、防止对象被意外修改等。

    1 年前
  • 在 Express.js 中使用 JSON Web Tokens 完成身份验证

    JSON Web Tokens(JWT)是一种基于 JSON 的安全令牌,用于在不同系统之间传递信息。在前端开发中,JWT 被广泛使用来完成用户身份验证和授权。Express.js 是一个流行的 No...

    1 年前
  • 基于 koa2 中间件实现登录鉴权流程

    在开发 Web 应用程序时,用户登录和权限控制是一个不可避免的问题。相信很多前端小伙伴也常常会接触到这个问题,因此本文将介绍如何使用 Koa2 中间件实现登录鉴权流程,以帮助大家更好地实现用户登录和权...

    1 年前
  • SPA 应用中如何使用 Webpack 实现代码分割?

    什么是 SPA 应用? SPA(Single Page Application)应用是指通过 Ajax 技术在同一个页面中动态切换不同的视图,使得用户可以更快地体验完整的页面应用,而不需要每次都进行页...

    1 年前
  • 优化 Mongoose 中的 find 和 findOne 查询方法

    Mongoose 是 Node.js 下操作 MongoDB 数据库的一款优秀的 ORM 框架,它提供了很多便捷的方法,其中最常用的就是 find 和 findOne 查询方法。

    1 年前
  • 如何实现 MongoDB 副本集?

    前言 MongoDB 是一个非关系型数据库,由于其架构灵活、性能优良等特点,已经成为越来越多企业或者个人的选择。而在这个数据库中,副本集作为其高可用方案之一,也是一种比较常见的架构模式。

    1 年前
  • CSS Grid 布局中如何使用 fr 和 minmax() 实现动态百分比布局

    什么是 CSS Grid 布局 CSS Grid 布局是一种二维的布局模式,可以让我们更方便地对一个网格进行布局。我们可以将整个布局分成多行和多列,并将网格的元素放置在这些行和列的交叉点上。

    1 年前
  • Hapi 框架中集成 Mongoose 进行 MongoDB 操作的方法

    近年来,随着 Node.js 在前端领域的快速发展,越来越多的前端开发人员开始探索 Node.js 的异步编程模式和服务器端应用开发。而在服务器端开发中,数据库操作是不可避免的一部分。

    1 年前
  • RxJS 在 Redux-Saga 中的应用

    在Web应用程序开发中,中间件是许多JavaScript应用程序的核心部分。这些中间件允许开发人员处理异步操作、日志记录和错误处理等任务。Redux-Saga是一个非常流行的中间件,它具有强大的异步操...

    1 年前
  • ES9 中新出现的 API:Object.entries() 和 Object.values()

    ES9 中新出现的 API:Object.entries() 和 Object.values() 在 ES9 中,我们看到了两个新的 API:Object.entries() 和 Object.val...

    1 年前
  • 解决 GraphQL 的循环依赖问题

    在使用 GraphQL 开发前端应用时,经常会遇到循环依赖的问题,尤其是在处理复杂的数据结构时。这个问题可能会导致应用出现奇怪的错误,并且增加调试难度。本文将介绍如何解决 GraphQL 循环依赖问题...

    1 年前
  • React Native 开发:如何实现拖拽排序

    React Native 开发:如何实现拖拽排序 在移动应用开发中,拖拽排序是一个常见的功能。类似于 iPhone 的桌面应用程序将应用程序图标拖动到新位置。在 React Native 中,可以使用...

    1 年前

相关推荐

    暂无文章