编写文件服务器
文件服务器监听传入的 HTTP 请求并从本地文件系统提供文件。本教程演示了如何使用 Deno 内置的文件系统 API 创建一个简单的文件服务器。
编写一个简单的文件服务器 Jump to heading
首先,创建一个名为 file-server.ts
的新文件。
我们将使用 Deno 内置的 HTTP 服务器来监听传入的请求。在新的 file-server.ts
文件中,添加以下代码
Deno.serve(
{ hostname: "localhost", port: 8080 },
async (request) => {
const url = new URL(request.url);
const filepath = decodeURIComponent(url.pathname);
},
);
如果您不熟悉
URL
对象,可以在 URL API 文档中了解更多信息。decodeURIComponent 函数用于解码 URL 编码的路径,以防字符被百分比编码。)
打开文件并流式传输其内容 Jump to heading
收到请求时,我们将尝试使用 Deno.open
打开请求 URL 中指定的文件。
如果请求的文件存在,我们将使用 ReadableStream API 将其转换为可读的数据流,并将其内容流式传输到响应中。我们不知道请求的文件可能有多大,因此流式传输将防止在同时提供大文件或多个请求时出现内存问题。
如果文件不存在,我们将返回“404 Not Found”响应。
在请求处理程序的主体中,在两个变量下方,添加以下代码
try {
const file = await Deno.open("." + filepath, { read: true });
return new Response(file.readable);
} catch {
return new Response("404 Not Found", { status: 404 });
}
运行文件服务器 Jump to heading
使用 deno run
命令运行新的文件服务器,允许读取访问和网络访问
deno run --allow-read=. --allow-net file-server.ts
使用 Deno 标准库提供的文件服务器 Jump to heading
从头开始编写文件服务器是理解 Deno HTTP 服务器工作原理的一个很好的练习。然而,从头开始编写生产级的文件服务器可能复杂且容易出错。最好使用经过测试且可靠的解决方案。
Deno 标准库为您提供了一个文件服务器,这样您就不必自己编写了。
要使用它,首先将远程脚本安装到本地文件系统
# Deno 1.x
deno install --allow-net --allow-read jsr:@std/http/file-server
# Deno 2.x
deno install --global --allow-net --allow-read jsr:@std/http/file-server
这将把脚本安装到 Deno 安装根目录,例如
/home/user/.deno/bin/file-server
。
您现在可以使用简化的脚本名称运行脚本
$ file-server .
Listening on:
- Local: http://0.0.0.0:8000
要查看文件服务器可用的完整选项列表,请运行 file-server --help
。
如果您在网络浏览器中访问 http://0.0.0.0:8000/,您将看到本地目录的内容。
在 Deno 项目中使用 @std/http 文件服务器 Jump to heading
要在Deno 项目中使用文件服务器,您可以将其添加到 deno.json
文件中,如下所示
deno add jsr:@std/http
然后将其导入到您的项目中
import { serveDir } from "@std/http/file-server";
Deno.serve((req) => {
const pathname = new URL(req.url).pathname;
if (pathname.startsWith("/static")) {
return serveDir(req, {
fsRoot: "path/to/static/files/dir",
});
}
return new Response();
});
此代码将使用 Deno.serve
设置一个 HTTP 服务器。当请求传入时,它会检查请求的路径是否以“/static”开头。如果是,它将从指定目录提供文件。否则,它将返回一个空响应。
🦕 现在您知道如何编写自己的简单文件服务器,以及如何使用 Deno 标准库提供的文件服务器工具了。您已具备处理各种任务的能力——无论是提供静态文件、处理上传、转换数据还是管理访问控制——您都已准备好使用 Deno 提供文件服务。