如何将 GraphQL 用于企业应用程序

How to use GraphQL for enterprise applications

提问前的简短介绍:

我目前正处于开发企业应用程序的规划阶段,其中有许多服务,每个服务都有大量业务逻辑。

我最近被介绍并要求加入 GraphQL

问题:

如果 GraphQL 直接从数据库中获取数据并呈现出来,我该如何实现 GraphQL 来处理中间件任务、后端验证等业务逻辑、复杂的业务检查、批处理等? 如果不是,那么它只是一个基于数据库查询的声明式库吗?

If GraphQL directly obtains the data from the database and presents it, how can I implement GraphQL to handle middleware tasks, business logic like back-end validations, complex business checks, batch processes etc?

GraphQL 不直接从数据库中获取数据。 GraphQL 实现通过一个与任何其他端点没有区别的端点公开,这意味着您可以使用您想要的任何中间件、身份验证堆栈、验证等。它也是与数据库无关的。同样,你可以使用任何你想要的数据库、ORM 等的组合。

If not, then is it just a Declarative library on top of database queries?

不完全是。 GraphQL 实现有两个主要部分——模式和解析器。模式简单地定义了数据的形状,解析器负责繁重的工作。解析器是逻辑层,它定义了如何为模式中定义的每个字段获取和转换数据。更多关于下面的解析器。

How is it different than using a NoSQL database?

GraphQL 的主要卖点是让消费者准确定义他们需要的数据。对于平面(即非嵌套)数据,这可能没什么大不了的。但是当您开始处理更多嵌套的数据时,它会变得越来越有优势。例如,假设您有一个如下所示的 GraphQL 查询:

query {
  user(userId: "some_user_id") {
    ...userData
    projects {
      ...projectData
      assets {
        ...assetData
      }
    }
  }
}

我们正在获取用户、该用户的项目以及每个项目的资产,我们可以在每个级别准确指定我们想要的字段。一个用户可能有 15 个字段,但也许我们只需要其中的两个或三个。项目和资产也是如此。由于 GraphQL 解析器是智能的,我们不必担心在任何给定查询中实际请求了哪些字段。仅返回作为查询一部分请求的字段。如果通过异步函数解析字段,则只有在请求该字段时才会执行该函数。

最后,客户端返回 JSON 匹配查询的形状,但(我希望)我们永远不会在 NoSQL 数据库中存储这样的嵌套数据。还有像 dataloader 这样的工具可以更容易地通过批处理和缓存优化查询。

GraphQL tends to rely on such applications where the front end directly communicates with the data.

从上面可以看出,情况并非如此。