引入
本章将介绍如何使用 Deno 创建一个基本的 HTTP 服务器。我们将从简单的示例开始,逐步深入,直到你可以创建功能齐全的 Web 服务。
安装 Deno
首先确保你的系统上已经安装了 Deno。你可以通过以下命令来检查是否已安装:
deno --version
如果没有安装,可以参考 Deno 的官方文档进行安装。
创建项目
我们将在当前目录下创建一个名为 basic-http-server 的新文件夹,并进入该文件夹:
mkdir basic-http-server cd basic-http-server
初始化项目
接下来,我们可以初始化一个新的 Deno 项目。虽然 Deno 不强制要求使用 deno.json 文件,但为了方便管理依赖和配置,建议创建一个。你可以手动创建这个文件,也可以运行以下命令自动生成:
deno run -A https://deno.land/x/seed@v0.6.0/mod.ts
这会生成一个 deno.json 文件,内容如下:
{
"name": "basic-http-server",
"version": "1.0.0",
"description": "",
"main": "mod.ts",
"scripts": {},
"dependencies": {}
}编写代码
接下来,我们将编写第一个 HTTP 服务器。在项目的根目录下创建一个名为 server.ts 的文件,并输入以下代码:
import { serve } from "https://deno.land/std@0.143.0/http/server.ts";
const server = serve({ port: 8000 });
console.log("HTTP server running on http://localhost:8000");
for await (const req of server) {
req.respond({ body: "Hello World\n" });
}这段代码引入了 Deno 的标准库中的 serve 函数,用于创建一个监听在 8000 端口的 HTTP 服务器。每当有请求到达时,服务器都会返回 "Hello World" 文本。
运行服务器
保存文件后,可以通过运行以下命令启动服务器:
deno run --allow-net server.ts
--allow-net 参数允许 Deno 访问网络,因为我们的 HTTP 服务器需要监听端口。
打开浏览器并访问 http://localhost:8000,你应该能看到页面显示 "Hello World"。
路由处理
接下来我们将增加一些功能,比如处理不同的路由。修改 server.ts 文件,添加对不同路径的响应:
// www.javascriptcn.com code example
import { serve } from "https://deno.land/std@0.143.0/http/server.ts";
const server = serve({ port: 8000 });
console.log("HTTP server running on http://localhost:8000");
for await (const req of server) {
const url = new URL(req.url);
let responseText;
switch (url.pathname) {
case "/":
responseText = "Welcome to the homepage!";
break;
case "/about":
responseText = "This is the about page.";
break;
default:
responseText = "Not Found";
}
req.respond({ body: responseText });
}现在我们有了一个简单的路由处理器,可以针对根路径 ("/") 和 /about 路径返回不同的消息。
添加静态文件支持
为了让服务器能够提供静态文件,如 HTML、CSS 或 JavaScript 文件,我们需要稍微调整代码。首先,创建一个 public 文件夹并在其中放入一些静态资源文件,例如 index.html:
// www.javascriptcn.com code example <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Home Page</title> </head> <body> <h1>Welcome to the Homepage!</h1> </body> </html>
然后更新 server.ts 文件,加入静态文件处理逻辑:
// www.javascriptcn.com code example
import { serve } from "https://deno.land/std@0.143.0/http/server.ts";
import { existsSync } from "https://deno.land/std@0.143.0/fs/mod.ts";
const server = serve({ port: 8000 });
console.log("HTTP server running on http://localhost:8000");
for await (const req of server) {
const url = new URL(req.url);
let responseText;
switch (url.pathname) {
case "/":
responseText = "Welcome to the homepage!";
break;
case "/about":
responseText = "This is the about page.";
break;
default:
if (existsSync(`./public${url.pathname}`)) {
responseText = await Deno.readTextFile(`./public${url.pathname}`);
} else {
responseText = "Not Found";
}
}
req.respond({ body: responseText });
}在这个版本中,我们使用了 existsSync 函数来检查文件是否存在,并且使用 readTextFile 方法读取文件内容作为响应体。
总结
至此,你已经学会了如何使用 Deno 创建一个基本的 HTTP 服务器,包括简单的路由处理以及静态文件的支持。这只是 Deno 众多强大功能的一个起点。通过进一步的学习和实践,你可以构建出更复杂和功能丰富的 Web 应用程序。