FORMA

HTTP 服务器

Deno 内置 HTTP 服务器

Deno 提供了内置的 HTTP 服务器 API Deno.serve,无需安装任何第三方库即可创建高性能的 HTTP/1.1 和 HTTP/2 服务。它基于标准的 Web API RequestResponse 对象,使得开发者可以快速上手。

一、简单示例

typescript
// server.ts
Deno.serve((_req) => {
  return new Response("Hello, World!");
});

运行(需要明确授予网络权限):

bash
deno run --allow-net server.ts

注意:Deno.serve 默认监听 0.0.0.0:8000。如果端口被占用,会抛出异常。

二、监听指定端口和主机名

通过给 Deno.serve 传递第一个参数(配置对象),可以自定义端口和主机名。

typescript
Deno.serve({ port: 4242, hostname: "0.0.0.0" }, (_req) => {
  return new Response("Hello, World!");
});
  • port:监听的端口号(默认 8000)。
  • hostname:监听的网络接口(默认 "0.0.0.0" 表示所有可用接口)。

三、推荐方式:deno serve 命令

Deno 提供了一个专用的 deno serve 命令,可以以更简洁的方式运行 HTTP 服务器。使用该命令时,文件必须导出一个包含 fetch 处理函数的默认对象。

typescript
// server.ts
export default {
  fetch(_req: Request) {
    return new Response("Hello, World!");
  },
  onListen({ hostname, port }) {
    console.log(`Server running at http://${hostname}:${port}/`);
  },
} satisfies Deno.ServeDefaultExport;

运行

bash
deno serve --port=3000 server.ts

deno serve 会自动处理权限(隐式添加 --allow-net),并提供 --watch 等开发友好选项。

四、路由示例

根据请求的 URL 路径返回不同内容:

typescript
export default {
  fetch(request: Request) {
    const url = new URL(request.url);

    if (url.pathname === "/api/health") {
      return Response.json({ status: "ok" });
    }

    if (url.pathname === "/api/users") {
      return Response.json([
        { id: 1, name: "Alice" },
        { id: 2, name: "Bob" },
      ]);
    }

    return new Response("Not found", { status: 404 });
  },
} satisfies Deno.ServeDefaultExport;

特点

  • 使用标准 URL 构造函数解析请求路径和查询参数。
  • 使用 Response.json() 快捷方法返回 JSON 数据。
  • 可以返回 404500 等状态码。

五、进阶用法

  • 获取请求体:通过 await request.json()request.text()request.formData()
  • 读取请求头request.headers.get("content-type")
  • 流式响应return new Response(readableStream)
  • 强制使用 HTTP/2:Deno 会根据客户端能力自动协商,目前无需显式配置。

六、注意事项

  • 权限要求:必须授予 --allow-net,否则 Deno.serve 会因权限错误而失败。
  • 并发模型:Deno 默认使用多线程(基于 Tokio)处理请求,无需额外配置即可应对大量并发连接。
  • 生产部署:建议搭配反向代理(如 Nginx)或直接使用 deno serve 配合 --allow-net--addr 参数。

总结

特性说明
APIDeno.servedeno serve 命令
协议HTTP/1.1 + HTTP/2
默认端口8000
权限--allow-net
响应对象标准 Response
推荐方式deno serve server.ts

Deno 内置的 HTTP 服务器足以支撑中小规模服务,且与 Web 标准完全兼容。更复杂的路由、中间件可结合 Hono 等框架(通过 npm:hono 或 JSR 引入)。

参考文献

资料说明
Deno.serveAPI 参考
deno serveCLI
Web Fetch APIRequest / Response