GraphQL 是一种使用查询语言来从服务器获取数据的 API 规范。使用 GraphQL,前端开发人员可以非常容易地获取所需的数据,而无需去请求多个不同的 RESTful API 接口。目前,GraphQL 在前端开发中越来越受欢迎,而 Deno 作为一个类似于 Node.js 的 JavaScript 和 TypeScript 运行时环境,也提供了便利的功能以便使用 GraphQL 来编写服务器端应用程序。本文将讲解使用 Deno 开发 GraphQL 服务器的最佳实践。
安装 Deno 和相关依赖
在使用 Deno 开发 GraphQL 服务器之前,我们需要先安装 Deno 和相关依赖。你可以访问 Deno 的官方网站 (https://deno.land/) 下载并安装 Deno。同时,我们还需要安装一些 Deno 的模块,包括如下模块:
oak
:一个相对于 Koa 框架的使用 Deno 编写的 Web 应用框架。graphql
:一个可以让我们定义 GraphQL schema 和 resolver 方法的 JavaScript 模块。
你可以使用以下命令来进行安装:
$ deno install --allow-read --allow-net https://deno.land/x/install/install.js $ deno install --allow-read --allow-net --allow-env --allow-run main.ts $ deno install --allow-read --allow-net --allow-env --allow-run --no-check https://deno.land/x/mod.land/mod.ts $ deno install --allow-env --allow-net https://deno.land/x/ntdb_server/main.ts $ deno install --allow-env --allow-net https://deno.land/x/ntdb/main.ts
定义 GraphQL schema
在使用 Deno 开发 GraphQL 服务器时,我们需要首先定义我们的 GraphQL schema。在 GraphQL schema 中,我们定义了我们的数据模型以及与这些数据模型交互的方法。我们使用 graphql
模块中的 GraphQLSchema
和 GraphQLObjectType
来定义我们的 schema。
下面是一个示例 schema 声明:
import { GraphQLSchema, GraphQLObjectType, GraphQLString, GraphQLInt, GraphQLList, GraphQLNonNull } from "graphql"; const UserType = new GraphQLObjectType({ name: "User", fields: () => ({ id: { type: GraphQLInt }, name: { type: GraphQLString }, age: { type: GraphQLInt } }) }); const QueryType = new GraphQLObjectType({ name: "Query", fields: () => ({ users: { type: new GraphQLList(UserType), resolve: () => { // ... } } }) }); const MutationType = new GraphQLObjectType({ name: "Mutation", fields: () => ({ addUser: { type: UserType, args: { name: { type: new GraphQLNonNull(GraphQLString) }, age: { type: new GraphQLNonNull(GraphQLInt) } }, resolve: (root, args) => { // ... } } }) }); const schema = new GraphQLSchema({ query: QueryType, mutation: MutationType });
在上面的示例代码中,我们定义了一个名为 User
的对象类型,以及一个名为 Query
和名为 Mutation
的对象类型,这两者用来定义查询和变异方法。我们使用 GraphQLInt
、GraphQLString
等类型来定义属性的数据类型。
定义 GraphQL resolver
在 GraphQL schema 中定义的方法必须要有相应的 resolver 函数来处理这些请求。我们可以在 QueryType
和 MutationType
中的函数中添加 resolver 函数。
下面是一个示例 resolver 函数:
const resolvers = { Query: { users() { //... }, }, Mutation: { addUser(root, args) { //... }, }, };
在上面的示例中,我们返回了一个 users
方法和一个 addUser
方法。这些方法接受相关参数,并使用它们来处理请求。返回结果的格式应该与相应 GraphQL 查询的格式相对应。
使用 Deno 和 Oak 编写 GraphQL API
在定义好我们的 schema 和 resolver 之后,我们可以使用 Deno 和 Oak 来编写我们的 GraphQL API。
下面是一个示例 API 声明:
import { Application } from "https://deno.land/x/oak/mod.ts"; import { applyGraphQL } from "https://deno.land/x/oak_graphql/mod.ts"; import { schema } from "./schema.ts"; import { resolvers } from "./resolvers.ts"; const app = new Application(); const GraphQLService = await applyGraphQL({ path: "/graphql", typeDefs: schema, resolvers, }); app.use(GraphQLService.routes(), GraphQLService.allowedMethods()); console.log("Server started on http://localhost:8000"); await app.listen({ port: 8000 });
上面的示例中,我们使用 applyGraphQL()
方法来创建 GraphQL 服务。在服务的挂载路径和 schema 和 resolver 必须要正确匹配。当服务启动后,我们可以在浏览器中访问 http://localhost:8000/graphql
查看是否运行成功。
总结
本文简要介绍了使用 Deno 开发 GraphQL 服务器的最佳实践,包括如何定义 GraphQL schema 和 resolver、使用 Deno 和 Oak 来编写 GraphQL API。希望读者们能够通过本文的讲解了解有关使用 Deno 开发 GraphQL 服务器的基础知识。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65b621c0add4f0e0ffed2af7