GraphQL简介
GraphQL是一种新的数据查询语言和API协议,由Facebook于2015年开源。GraphQL提供了一种更有效,更强大和更直观的方式来定义API端点,并使用它作为前后端之间的中间件。 GraphQL使用类型化的查询来定义客户端需要什么,并且仅返回请求的数据。这使得客户端可以根据其独特的数据需求来决定查询哪些数据,从而降低了API响应时间和传输的数据量。同时,GraphQL还具有深度嵌套查询和自我描述的特性,提高了代码的重用性和可维护性。
graphql-server-decorators
graphql-server-decorators是一个npm包,它使得在Node.js服务器上编写GraphQL服务变得更加容易。它是基于TypeScript编写的,使用装饰器来定义GraphQL的Schema和resolvers。使用这种方式,我们可以方便地定义GraphQL API,减少了代码长度,尤其是当我们需要为每个对象都编写解析器时。
下面我们将介绍如何使用graphql-server-decorators来构建GraphQL API。
安装
首先需要安装Node.js和npm。在命令行中,输入以下命令来安装graphql-server-decorators包:
npm i graphql graphql-server-decorators
定义GraphQL模式
GraphQL模式定义了API的类型和字段。使用GraphQL模式,我们可以定义数据类型、输入类型、查询类型和输入类型。在graphql-server-decorators中,我们可以使用装饰器来定义这些东西。
例如,我们可以定义一个User对象,其具有id,name和email字段:
-- -------------------- ---- ------- ------ - ----------- ------ -- - ---- ---------------------------- ------------- ----- ---- - --------- -- --- --- ------- -------- ----- ------- -------- ------ ------- - ------ ------- -----
在上面的代码中,我们首先导入ObjectType,Field和ID装饰器。然后,我们定义一个User类,并为其添加ObjectType装饰器。这告诉graphql-server-decorators,它是GraphQL模式中的一个对象类型。接下来,我们添加三个字段——id,name和email——通过@Field装饰器。每个装饰器都告诉graphql-server-decorators每个字段的名称和类型。
你可以使用其他装饰器来定义GraphQL其他类型的字段,例如List类型:
-- -------------------- ---- ------- ------ - ----------- ------ --- ---- ---- - ---- ---------------------------- ------ - ---- - ---- --------- ------------- ----- ---- - --------- -- --- --- ------- -------- ----- ------- -------- ------ ------- --------- -- ---- ---- ------- --------- -- ------- ------ ------- - ------ ------- -----
在上面的代码中,我们添加了一个Int类型的age字段,一个Post对象的List类型的posts字段。这些字段是与User类型相关联的字段。
定义GraphQL解析器
GraphQL解析器负责接收查询并返回相应的数据。我们可以使用graphql-server-decorators来定义这些解析器。
例如,我们可以定义一个User查询,该查询返回所有用户:
-- -------------------- ---- ------- ------ - ------ -------- - ---- ---------------------------- ------ - ---- - ---- --------- ----------- ----- ------------- - --------- -- ------- ----- ------- - ----- ----- - ----- -------------- ------ ------ - - ------ ------- --------------
在上面的代码中,我们首先导入Query和Resolver装饰器,以及用户模型。然后我们定义一个UserResolvers类,并为其添加Resolver装饰器。这告诉graphql-server-decorators,这个类是GraphQL解析器。 接下来,我们添加一个users查询,它返回所有用户。在该方法上的Query装饰器告诉graphql-server-decorators,它是GraphQL的查询,并告诉它返回的类型是User类型的List。
启动GraphQL服务器
现在我们已经定义了GraphQL的模式和解析器,我们需要启动服务器。可以使用graphql-server-express包来启动服务器。
-- -------------------- ---- ------- ------ ------- ---- ---------- ------ - ----------- - ---- ------------------ ------ - --------------- - ---- ---------- ------ - ------------ - ---- ------- ------ - ------------- - ---- ------------------------ ------ - ------------- - ---- ------------------------ ------ - ---- - ---- -------------- ------ - ---- - ---- -------------- ----- --- - ---------- ----- ------ - ----------------- ---------- --------------- --------------- --------------- ----- --------- ----- --- -------- ----------- ------------- ------- --------- ----- -- -- ----- ------ - ------------------ ----- ---- - ---------------- -- ----- ------ -- -- - --- - ----- ------------------------ ----- ------------------------ ------------------- -- -- - ------------------- -- ------- -- ----------------------------------- --- - ----- ------- - --------------------- - -----
在上面的代码中,我们首先导入了express、graphqlHTTP和其他相关的模块。然后,我们通过buildSchemaSync函数创建了一个GraphQL模式,将UserResolvers和PostResolvers作为解析器数组一起传递。
接下来,我们使用graphqlHTTP包创建了一个GraphQL服务器,并将其配置到/graphql路径上。设置graphiql为true会启用GraphQL的Web IDE。最后,我们使用createServer函数创建了HTTP服务器,并将其与端口4000绑定。
使用GraphQL查询
现在我们已经启动了GraphQL服务器,可以使用curl或其他工具来查询API。例如,我们可以查询所有用户:
curl -X POST -H "Content-Type: application/json" -d '{"query": "{ users { name email } }"}' http://localhost:4000/graphql
如果一切顺利,您应该会看到以下输出:
-- -------------------- ---- ------- - ------- - -------- - - ------- ------- -------- ---------------------- -- - ------- ------- -------- ---------------------- - - - -
结论
我们已经介绍了如何使用graphql-server-decorators包构建GraphQL API。使用装饰器可以简化GraphQL API的编写过程,并且代码更为简洁。请尝试使用graphql-server-decorators包在自己的项目中编写GraphQL API。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6005584781e8991b448d57d7