在前端开发领域中,Graphql 是一种非常流行的 API 查询语言。而 @johnydays/express-graphql 则是一个便捷且易于使用的 npm 包,用于在 Express 应用中使用 Graphql。在本篇文章中,我们将深入探讨 @johnydays/express-graphql 的使用方法,并提供详细的代码示例。
安装
使用 npm 安装 @johnydays/express-graphql:
npm install --save @johnydays/express-graphql
基本用法
下面是一个使用 @johnydays/express-graphql 的基本示例,我们需要导入该包并使用 graphqlHTTP
方法创建一个 Graphql 中间件:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- - ----------- - - -------------------------------------- ----- - ----------- - - ------------------- -- -- ------- ------ ----- ------ - ------------- ---- ----- - ------ ------ - --- -- -- -------- ----- --------- - - ------ -- -- ------ -------- -- -- -- ------- -- ----- --- - ---------- ------------------- ------------- ------- ---------- --------- ----- -- -- ------- --- ---- ---------------- -- -- - ------------------- ------- -- ---- -------- ---
在上面的示例代码中,我们通过 buildSchema
方法创建了一个 Graphql Schema。在 Schema 中,我们定义了一个查询 hello
,它的返回值类型为 String
。
接下来,我们定义了一个名为 rootValue
的对象,它包含了一个 hello
方法,当查询 hello
时,该方法会被调用。
然后,我们创建了一个 Express 应用,并在 '/graphql'
路径下使用 @johnydays/express-graphql 中间件。在中间件的配置项中,我们传入了创建的 Schema 和 rootValue
对象。
最后,我们通过 app.listen
启动了应用,并在控制台输出了提示信息。
在浏览器中访问 http://localhost:3000/graphql
,即可打开 Graphql IDE;在 IDE 中输入查询语句 { hello }
,并点击运行按钮,会得到文字 Hello World!
的返回结果。
处理请求和错误
@johnydays/express-graphql 中间件提供了 formatError
和 formatResponse
两个配置项,用于处理请求和错误。
我们可以使用 formatError
对 Graphql 的错误进行自定义处理,在许多案例中,这非常有用。例如,可以用该方法将错误信息记录到日志中。
-- -------------------- ---- ------- ----- ------------------- ------------- ------- ---------- --------- ----- ------------ ------- -- - ------------------- ------ ------ -- ----
上面示例代码,我们使用 console.log
打印错误信息,并将错误对象返回。在实际开发中,我们可以将错误信息保存在日志文件中,以便日后排查错误。
另外,我们也可以使用 formatResponse
对 Graphql 的响应进行自定义处理。例如,可以通过该方法对响应结果进行加工或过滤。
-- -------------------- ---- ------- ----- ------------------- ------------- ------- ---------- --------- ----- --------------- ---------- -- - -- ----------------- - --------------- - -- -------- ---------------- --- - ------ --------- -- ----
上面的示例代码中,我们在 formatResponse
方法中对 Graphql 的响应进行了自定义处理。如果响应中存在错误,我们会将错误信息修改为一个自定义的错误信息。这种方式可以避免向用户暴露过多的技术细节。
处理请求体
默认情况下,@johnydays/express-graphql 中间件在请求体中解析 Graphql 查询。然而,对于某些环境或特定场景,可能无法直接从请求体中解析查询时,我们可以使用 Graphql 的 parse 函数手动解析查询语句。
-- -------------------- ---- ------- ----- ------- - ------------------- ----- - ------- - - ------------------- ----- - ----------- - - -------------------------------------- ----- - ------------ ----- - - ------------------- ----- -------------------- ----- ----- ---- -- - ----- ----- - --------------- ----- - ---------- ------------- - - --------- --- - ----- --- - ------------- -- ---- ----- ------ - ----- --------------- ---- ---------- --- ---------- --------------- ----------------- - ----- ------- - ---------------------- ------- ------- --- - ---
上面的示例代码中,我们手动解析了请求体中的查询语句,并调用 Graphql 的 graphql
方法进行查询。在上述代码示例中,我们使用了 Express 应用的 post
方法来处理 Graphql 查询,并使用 ast
来执行查询。parse
方法可以用来解析查询语句,并根据需求进行额外的处理。
自定义 GraphQL 关联类型
GraphQL 中有一种非常有用的类型,称为“关联类型”(Relay)。可以使用关联类型来连接查询,从而避免重复的查询。然而,@johnydays/express-graphql 中间件不直接支持这种类型。
不过,我们可以使用 Graphql 的接口来定义自己的关联类型。
-- -------------------- ---- ------- -- --- -- ------- ----- - -------------- --------- - - ---------------- ---------- -- - ----- - ----- -- - - ----------------------- -- ----- --- ------- - -- ------- ---- ------ ---------------- - ---- -- ----- --- ---------- - -- ------- ------- ------ ------------------- - -- ----- -- - -- ---- ---------- ----- - -- -- -------- ------ --------- - ---- -- ---- ---------- -------- - -- -- ----------- ------ ------------ - -- -- -- ------ ----- -------- - --- ------------------- ----- ------- ------- - --- ---------------------- ----- - ----- ------------- -- --------- - ----- --- ------------------------- -------- ------ -- - -- --------- ------ ----------------------------- -- -- -- --- -- ----------- ---------------- -- ---------- --- ----- ----------- - --- ------------------- ----- ---------- ------- - --- ------------------------- -------- - ----- ------------- -- ----- - ----- --------- -------- --------- -- - -- --------- ------ ---------------------------- -- -- -- --- -- ----------- ---------------- --- -- ----- ----- ------------- - --- ------------------- ----- -------- ------- - ----- ---------- ------ - ----- --- ---------------------- -------- -- -- - -- ------ ------ ----------- -- -- --------- - ----- --- ------------------------- -------- -- -- - -- ------ ------ -------------- -- -- -- --- -- --- -------- ----- ---------------- - --- ------------------- ----- ----------- ------- - -------- - ----- --------- ----- - ----- - ----- --- ----------------------------- -- -- -------- --- - ---- -- -- - -- ----- ------ -------------- -- -- ----------- - ----- ------------ ----- - ------- - ----- --- ------------------------- -- -------- - ----- --- ----------------------------- -- -- -------- --- - ------- ------- -- -- - -- ----- ------ ------------------ --------- -- -- -- --- -- --- -- -- ------------- ----- ------ - --- --------------- ------ -------------- --------- ----------------- ---
上面的代码示例中,我们使用 Graphql 的 nodeDefinitions
方法定义了自己的接口,以方便查询和使用。这个接口会被用于定义 UserType
和 CommentType
的关联类型。
在 UserType
中,我们定义了关联类型 comments
,该字段连接了 UserType
与 CommentType
(即评论),使得查询用户时,也可以同时查询其评论列表。
在 CommentType
中,我们定义了关联类型 user
,该字段连接了 CommentType
与 UserType
(即用户),使得查询评论时,也可以同时查询评论所属用户的信息。
最后,我们将定义好的 UserType
和 CommentType
作为参数,创建了 RootQueryType
和 RootMutationType
。并将它们作为参数,创建了一个 GraphQLSchema。这样,我们就可以使用 @johnydays/express-graphql 中间件,将定义好的 Schema 部署到我们的应用中了。
结语
@johnydays/express-graphql 提供了一种非常方便的方法,用于在 Express 应用程序中使用 Graphql。在本文中,我们提供了详细的代码示例,向大家展示了如何使用该包来构建 Graphql API。除此之外,我们还介绍了如何处理 Graphql 的请求和错误,以及如何自定义 GraphQL 关联类型。我们希望这篇文章能够对你在应用程序开发中使用 Graphql 提供一些帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60066bc4967216659e2442fe