在传统的 RESTful API 架构中,每个接口定义的返回值都是固定的,即便客户端需要获取的数据只有一部分,服务端也会将所有数据返回。而在分布式系统中,由于服务器数量及位置的变化,这种方法可能导致性能问题。
GraphQL 的出现解决了这个问题。它是一种新型的 API 定义语言和执行引擎,可以通过查询和获取客户端请求的数据,更好的构建分布式 API 架构。
graphql-js
首先,我们需要安装 graphql-js
,它是使用 GraphQL 构建分布式 API 的流行 JavaScript 库。可以使用以下命令安装它:
npm install graphql graphql-tools express express-graphql
创建模式
在 GraphQL 中,模式用于定义所有可用查询的属性和类型。下面是一个示例模式定义,它定义了 User
和 Post
两个对象类型:
-- -------------------- ---- ------- ----- - -------------------- - - ------------------------- ----- -------- - - ---- ---- - --- --- ----- ------- - ---- ---- - --- --- ------ ------- ----- ------- ------- ----- - ---- ----- - ------ ------ -------- ----- ---- ------ ------ - ---- -------- - ----------------- -------- ----- -------- --------- ----- ---- - -- ----- --------- - - ------ - ------ -- -- ------ -------- ----- ------ - -- -- -- ----------- - -- --- ------ -- -- ------ -- --------- - ----------- ------ ----- -- - ----- ---- - - --- ------------ - -- ------ ----------- ----- ---------- --------- -------------- -- ----------------- ------ ----- -- -- ----- - ------------ - ------ ----------- - --- ------------- --- -- -- ----- - ----------- - ------ ------------- - --------- ------- --- -- -- -- ----- ------ - ---------------------- --------- ---------- ---
创建服务器
下一步是创建服务器,这里我们使用 Express 和 express-graphql
来创建 GraphQL HTTP 服务器。以下是服务器配置:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ----------- - --------------------------- ----- --- - ---------- ------------------- ------------- ------- --------- ----- ---- ---------------- -- -- - ------------------- ------- -- -------------------------------- ---
查询语言
GraphQL 提供了一种查询语言,用于获取所需的数据。下面是一个查询示例,它将返回 Post
对象类型的所有字段:
-- -------------------- ---- ------- ----- - ----- - -- ----- ---- ------ - -- ---- - - -
还可以进行更高级的查询,例如过滤和分页。
总结
GraphQL 提供了一种灵活且效率高的方式来构建分布式 API,适用于大型的多服务器系统。这篇文章介绍了使用 graphql-js
和 Express 构建 GraphQL API 的基础知识,以及如何定义模式、创建服务器和使用查询语言。希望这篇文章可以对需要使用 GraphQL 构建分布式 API 的前端工程师提供一些有益的指导。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e7a8f3f6b2d6eab3331494