利用 Deno 实现 GraphQL 服务器和客户端

GraphQL 是一种用于 API 开发的查询语言和运行时环境。Deno 是一个现代化的 JavaScript 运行时,可以用于服务器端和客户端的开发。在本文中,我们将学习如何利用 Deno 实现 GraphQL 服务器和客户端。

准备工作

在开始学习之前,需要先安装 Deno。可以从 https://deno.land/ 下载最新版本的 Deno。安装完成后,可以在终端中输入以下命令来验证:

$ deno --version

可以看到输出了 Deno 的版本信息。

安装 GraphQL 库

可以使用 Deno 内置的模块库管理器来安装 GraphQL 库。在终端中输入以下命令:

$ deno install --allow-net --allow-read https://deno.land/x/oak/mod.ts
$ deno install --allow-net --allow-read https://cdn.skypack.dev/graphql

第一条命令用来安装 Oak,它是一个基于 Deno 的 Web 框架;第二条命令用来安装 GraphQL 库。

实现 GraphQL 服务器

以下是一个简单的 GraphQL 服务器实现。首先,创建一个名为 server.ts 的文件。

import { Application, Router } from "https://deno.land/x/oak/mod.ts";
import { graphql, buildSchema } from "https://cdn.skypack.dev/graphql";

// 定义 GraphQL schema
const schema = buildSchema(`
  type Query {
    hello: String
  }
`);

// 定义 resolvers
const root = {
  hello: () => {
    return "Hello World!";
  },
};

// 创建应用实例
const app = new Application();

// 创建路由实例
const router = new Router();

// 处理 GraphQL 请求
router.post("/graphql", async (ctx) => {
  const requestBody = await ctx.request.body().value;
  const { query } = JSON.parse(requestBody);
  const response = await graphql({ schema, source: query, rootValue: root });
  ctx.response.body = response;
});

// 注册路由
app.use(router.routes());
app.use(router.allowedMethods());

// 启动服务器
console.log("Server started at http://localhost:8000");
await app.listen({ port: 8000 });

在这个例子中,我们使用 GraphQL 的 buildSchema 方法来定义 schema。其中,我们定义了一个名为 hello 的查询,它返回一个字符串。我们还定义了一个名为 root 的对象,它包含了一个名为 hello 的函数,它返回字符串 "Hello World!"。最后,我们创建了一个 HTTP 服务器实例,并处理了 GraphQL 请求。

启动服务器:

$ deno run --allow-net server.ts

现在,在浏览器中输入 http://localhost:8000/graphql 地址,可以看到 GraphQL Playground,可以在左侧的面板中输入查询语句:

query {
  hello
}

点击运行按钮,可以看到返回结果:

{
  "data": {
    "hello": "Hello World!"
  }
}

实现 GraphQL 客户端

以下是一个简单的 GraphQL 客户端实现。首先,创建一个名为 client.ts 的文件。

import { send } from "https://deno.land/std/http/mod.ts";

// GraphQL 查询
const query = `
  query {
    hello
  }
`;

// 发送 GraphQL 查询
const response = await send("http://localhost:8000/graphql", {
  method: "POST",
  body: JSON.stringify({ query }),
});

// 处理响应
const responseData = await response.json();
console.log(responseData.data.hello);

在这个例子中,我们使用 Deno 内置的 send 函数来发送 GraphQL 查询。我们发送的查询与上一节中类似,也是查询 hello 字段。发送完毕后,我们处理响应,并输出结果。

运行客户端:

$ deno run --allow-net client.ts

可以看到输出了字符串 "Hello World!"

总结

本文介绍了如何使用 Deno 实现 GraphQL 服务器和客户端。我们使用了 Deno 内置的模块库管理器来安装 GraphQL 库,并使用了 buildSchemagraphql 方法来定义 schema 和处理 GraphQL 请求。此外,我们还使用了 Deno 内置的 send 函数来发送 GraphQL 查询。这些技术可以帮助我们更方便地开发 GraphQL 应用程序。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65ab4594add4f0e0ff4e596c