介绍
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