从头开始学习 Deno 如何开发 REST API

介绍

Deno 是一个新的 JavaScript/TypeScript 运行时,由 Node.js 的创始人 Ryan Dahl 开发。Deno 采用了 V8 引擎和 Rust 编写的底层模块,可以在浏览器之外运行 JavaScript/TypeScript 代码。Deno 支持模块化开发、异步 I/O、ES6+ 特性和 TypeScript 等功能,且在安全性、可维护性和性能方面有很多优势。

REST API 是一种基于 HTTP 协议的应用程序接口,可以实现客户端和服务器之间的数据交互。REST API 通常使用 JSON 或 XML 格式传输数据,并使用 HTTP 方法(如 GET、POST、PUT、DELETE)来操作资源。在 Deno 中,我们可以使用标准库中的 http 模块来开发 REST API。

本文将介绍如何从头开始学习 Deno 如何开发 REST API,包括搭建开发环境、创建 API 路由、处理请求和响应、使用中间件等内容。

搭建开发环境

首先,我们需要安装 Deno 运行时。可以通过以下命令在命令行中安装 Deno:

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

安装完成后,我们可以通过以下命令验证 Deno 是否安装成功:

$ deno --version

接下来,我们需要安装一个文本编辑器,以便编写代码。推荐使用 Visual Studio Code(VS Code)编辑器,并安装 Deno 扩展,以便在编辑器中使用 Deno。可以通过以下命令安装 Deno 扩展:

$ code --install-extension denoland.vscode-deno

现在,我们已经搭建好了 Deno 开发环境。

创建 API 路由

在 Deno 中,我们可以使用标准库中的 http 模块来创建 HTTP 服务器。首先,我们需要创建一个 server.ts 文件,并引入 http 模块:

import { serve } from "http";

const server = serve({ port: 8000 });

console.log("Server is running on http://localhost:8000");

for await (const req of server) {
  console.log(`${req.method} ${req.url}`);
}

以上代码中,我们使用 serve 函数创建了一个监听 8000 端口的 HTTP 服务器,并在控制台输出了服务器运行的地址。然后,我们使用 for await 循环来监听客户端的请求,并输出请求的方法和路径。

现在,我们已经创建了一个简单的 HTTP 服务器。接下来,我们需要创建 API 路由,以便客户端可以通过不同的路径访问不同的资源。

import { serve } from "http";

const server = serve({ port: 8000 });

console.log("Server is running on http://localhost:8000");

for await (const req of server) {
  console.log(`${req.method} ${req.url}`);

  if (req.url === "/api/users") {
    if (req.method === "GET") {
      // 处理 GET 请求
    } else if (req.method === "POST") {
      // 处理 POST 请求
    } else if (req.method === "PUT") {
      // 处理 PUT 请求
    } else if (req.method === "DELETE") {
      // 处理 DELETE 请求
    }
  } else if (req.url === "/api/products") {
    if (req.method === "GET") {
      // 处理 GET 请求
    } else if (req.method === "POST") {
      // 处理 POST 请求
    } else if (req.method === "PUT") {
      // 处理 PUT 请求
    } else if (req.method === "DELETE") {
      // 处理 DELETE 请求
    }
  } else {
    req.respond({ status: 404, body: "Not Found" });
  }
}

以上代码中,我们在 for await 循环中使用了 if 语句来判断客户端请求的路径和方法,并分别处理不同的请求。如果客户端请求的路径不存在,则返回 404 状态码和错误信息。

处理请求和响应

在 REST API 中,客户端向服务器发送请求时,通常需要携带一些数据,例如查询参数、请求体和请求头等。服务器需要解析这些数据,并根据请求的路径和方法执行相应的操作,然后将结果返回给客户端。

在 Deno 中,我们可以使用标准库中的 RequestResponse 类来处理请求和响应。以下是一个简单的示例:

import { serve } from "http";

const server = serve({ port: 8000 });

console.log("Server is running on http://localhost:8000");

for await (const req of server) {
  console.log(`${req.method} ${req.url}`);

  if (req.url === "/api/users") {
    if (req.method === "GET") {
      const params = new URL(req.url, `http://${req.headers.get("host")}`).searchParams;
      const id = params.get("id");

      if (id) {
        req.respond({ body: `Get user with id ${id}` });
      } else {
        req.respond({ body: "Get all users" });
      }
    } else if (req.method === "POST") {
      const body = await req.json();

      req.respond({ body: `Create user with name ${body.name}` });
    } else if (req.method === "PUT") {
      const params = new URL(req.url, `http://${req.headers.get("host")}`).searchParams;
      const id = params.get("id");
      const body = await req.json();

      req.respond({ body: `Update user with id ${id} and name ${body.name}` });
    } else if (req.method === "DELETE") {
      const params = new URL(req.url, `http://${req.headers.get("host")}`).searchParams;
      const id = params.get("id");

      req.respond({ body: `Delete user with id ${id}` });
    }
  } else if (req.url === "/api/products") {
    // 处理产品资源的请求
  } else {
    req.respond({ status: 404, body: "Not Found" });
  }
}

以上代码中,我们在 GET 请求中解析了查询参数,并根据参数的值返回不同的结果;在 POST 请求中解析了请求体,并根据请求体的内容创建新的资源;在 PUT 请求中同时解析了查询参数和请求体,并根据参数和请求体的内容更新指定的资源;在 DELETE 请求中解析了查询参数,并根据参数的值删除指定的资源。

使用中间件

在 REST API 中,中间件是一种常用的技术,可以在请求和响应之间执行各种操作。例如,我们可以使用中间件来验证请求的身份、记录请求日志、处理错误等。

在 Deno 中,我们可以使用标准库中的 Middleware 类来实现中间件。以下是一个简单的示例:

import { serve } from "http";
import { Middleware } from "https://deno.land/x/oak/mod.ts";

const server = serve({ port: 8000 });

console.log("Server is running on http://localhost:8000");

const authMiddleware: Middleware = async (ctx, next) => {
  const token = ctx.request.headers.get("Authorization");

  if (token !== "secret") {
    ctx.response.status = 401;
    ctx.response.body = "Unauthorized";
    return;
  }

  await next();
};

for await (const req of server) {
  console.log(`${req.method} ${req.url}`);

  if (req.url === "/api/users") {
    // 处理用户资源的请求
  } else if (req.url === "/api/products") {
    // 处理产品资源的请求
  } else {
    req.respond({ status: 404, body: "Not Found" });
  }
}

以上代码中,我们使用了 Middleware 类来定义了一个名为 authMiddleware 的中间件,用于验证请求的身份。在每个请求到达时,我们可以通过 await next() 来调用下一个中间件或路由处理程序。

总结

本文介绍了如何从头开始学习 Deno 如何开发 REST API,包括搭建开发环境、创建 API 路由、处理请求和响应、使用中间件等内容。Deno 具有很多优势,例如安全性、可维护性和性能等,可以为开发者提供更好的开发体验和更高效的开发方式。希望本文对您有所帮助,欢迎提出宝贵的意见和建议。

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


纠错
反馈