在 Deno 中构建 REST API 和 GraphQL API

介绍

Deno 是一个由 Node.js 的创造者 Ryan Dahl 所开发的运行时环境,与 Node.js 不同的是,它内置了 TypeScript,并且使用更为安全的 V8 引擎,同时也不依赖 npm 包管理器,而是采用官方提供的特有的模块系统和包管理方式。

本篇文章将介绍如何在 Deno 环境中构建 REST API 和 GraphQL API。

REST API

安装

首先我们需要安装 Deno,可以使用以下代码:

curl -fsSL https://deno.land/x/install/install.sh | sh

或者在 官网 下载安装包进行安装。

安装成功后,我们可以在终端中输入 deno 命令,如果能够正常输出版本号说明安装成功。

创建应用

创建一个新的文件夹(比方说叫做 deno-rest-api),在其中创建一个新的文件 app.ts,该文件将作为我们的入口文件。

mkdir deno-rest-api
cd deno-rest-api
touch app.ts

实现应用

app.ts 中,我们可以先引入需要的模块。

import { Application, Router } from "https://deno.land/x/oak/mod.ts";

我们将使用 oak 模块来实现我们的 REST API。oak 是一个基于中间件的 web 框架,类似于 Koa。

接着我们可以创建一个路由。

const router = new Router();

router.get("/", (ctx) => {
  ctx.response.body = { message: "Hello, World!" };
});

这里我们创建了一个 GET 请求的路由,返回了一个 JSON 格式的数据。

最后,我们可以将路由添加到应用中,并且启动服务器。

const app = new Application();

app.use(router.routes());
app.use(router.allowedMethods());

await app.listen({ port: 8000 });

这里我们使用了 await 关键字来等待服务器启动完成,绑定 8000 端口。

运行应用

我们可以在终端中进入刚刚创建的 deno-rest-api 文件夹,运行 deno run --allow-net app.ts 命令,此时终端将输出如下信息:

Listening on http://localhost:8000

我们可以在浏览器中打开 http://localhost:8000,可以看到返回的 JSON 数据。

示例代码

import { Application, Router } from "https://deno.land/x/oak/mod.ts";

const router = new Router();

router.get("/", (ctx) => {
  ctx.response.body = { message: "Hello, World!" };
});

const app = new Application();

app.use(router.routes());
app.use(router.allowedMethods());

await app.listen({ port: 8000 });

GraphQL API

安装

同样的,我们需要先安装 Deno。

另外,我们需要安装 dgraphql 以及 dgraphql-opine 模块。

deno install -Afn https://deno.land/x/dgraphql/mod.ts
deno install -Afn https://deno.land/x/dgraphql_opine/mod.ts

创建应用

创建一个新的文件夹(比方说叫做 deno-graphql-api),在其中创建一个新的文件 app.ts,该文件将作为我们的入口文件。

mkdir deno-graphql-api
cd deno-graphql-api
touch app.ts

实现应用

app.ts 中,我们可以先引入需要的模块。

import { makeExecutableSchema } from "https://deno.land/x/graphql_tools/mod.ts";
import { graphqlHTTP } from "https://deno.land/x/dgraphql_opine/mod.ts";
import { opine } from "https://deno.land/x/dgraphql_opine/mod.ts";

我们将使用 graphql_tools 模块来构建我们的 GraphQL 解析器,dgraphql_opine 模块用于处理 GraphQL 请求,opine 模块用于提供 web 服务。

接着我们可以定义一个 schema,该 schema 定义了我们的数据结构以及操作方法。

const typeDefs = `
  type Book {
    id: ID!
    title: String!
    author: String!
  }

  type Query {
    books: [Book]
  }
`;

const books = [
  { id: "1", title: "Harry Potter and the Sorcerer's stone", author: "J.K. Rowling" },
  { id: "2", title: "Jurassic Park", author: "Michael Crichton" }
];

const resolvers = {
  Query: {
    books: () => books
  }
};

const schema = makeExecutableSchema({ typeDefs, resolvers });

接着我们可以构建一个 GraphQL 中间件。

const app = opine();

app.use("/graphql", graphqlHTTP({
  schema,
  graphiql: true
}));

这里我们使用了 graphiql 参数开启了 GraphiQL 的 web 界面。GraphiQL 是 GraphQL 的一个交互式 IDE,可以帮助我们测试和调试 GraphQL 请求。

最后,我们可以启动服务器。

app.listen(8000, () => console.log("Server running at http://localhost:8000"));

运行应用

同样的,我们可以在终端中进入刚刚创建的 deno-graphql-api 文件夹,运行 deno run --allow-net app.ts 命令,此时终端将输出如下信息:

Server running at http://localhost:8000

我们可以在浏览器中打开 http://localhost:8000/graphql,可以看到 GraphiQL 的 web 界面。

接着,我们可以在左侧的查询栏中输入如下查询语句:

{
  books {
    id
    title
    author
  }
}

点击 "Run" 按钮,可以看到返回的 JSON 数据。

示例代码

import { makeExecutableSchema } from "https://deno.land/x/graphql_tools/mod.ts";
import { graphqlHTTP } from "https://deno.land/x/dgraphql_opine/mod.ts";
import { opine } from "https://deno.land/x/dgraphql_opine/mod.ts";

const typeDefs = `
  type Book {
    id: ID!
    title: String!
    author: String!
  }

  type Query {
    books: [Book]
  }
`;

const books = [
  { id: "1", title: "Harry Potter and the Sorcerer's stone", author: "J.K. Rowling" },
  { id: "2", title: "Jurassic Park", author: "Michael Crichton" }
];

const resolvers = {
  Query: {
    books: () => books
  }
};

const schema = makeExecutableSchema({ typeDefs, resolvers });

const app = opine();

app.use("/graphql", graphqlHTTP({
  schema,
  graphiql: true
}));

app.listen(8000, () => console.log("Server running at http://localhost:8000"));

总结

本篇文章介绍了如何在 Deno 环境中构建 REST API 和 GraphQL API。Deno 提供了一种新的写法和方式,使用 TypeScript 进行开发能够更好地保证代码的可读性、可维护性和可扩展性。Deno 的安全性能更好,对于一些对安全性有要求的场景,Deno 是一个很好的选择。

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


纠错反馈