返回项目目录
服务端框架精选项目

Oak

受 Koa 启发、支持 Deno、Node.js、Bun 与 Cloudflare Workers 的 TypeScript 中间件框架。

主要语言TypeScript
开源许可MIT
项目类型服务端框架
维护状态活跃维护
OVERVIEW

项目概述

Oak 以 Application、Context、洋葱中间件和内置 Router 组织 HTTP 应用。它最初面向 Deno,如今通过 Web 标准与运行时适配覆盖服务器和边缘环境。

Oak 是一个用于处理 HTTP 请求的 TypeScript 中间件框架,设计受 Koa 启发,Router 则借鉴 @koa/router。它最初服务于 Deno 原生 HTTP Server,现在同一套 Application、Context 与 Router API 也可运行在 Node.js、Bun 和 Cloudflare Workers。请求会经过可组合的异步中间件栈,开发者通过 ctx.request 读取 URL、Header 与 Body,通过 ctx.response 设置状态、Header 和响应体;框架还内置路由、Cookie、静态文件、Server-Sent Events、WebSocket 及错误事件等常用能力。Oak 适合希望保留 Koa 式控制流,同时采用 TypeScript、Web 标准 API 和多运行时交付方式的项目。

当前版本Oak 17.2
运行环境Deno / Node / Bun / Workers
核心模型Application + Router
FEATURES

主要特点

Oak 将 Koa 风格中间件、类型化 Context、内置路由与 Web 标准接口组合成一套可跨运行时使用的 HTTP 开发体验。

01

异步中间件栈

中间件通过 await next() 进入下游并在返回后继续执行,适合统一实现错误边界、日志、计时、认证和响应加工。

02

内置类型化 Router

Router 支持 HTTP 方法、路径参数、命名路由、嵌套路由和 allowedMethods,常见路径参数还能由 TypeScript 自动推断。

03

清晰的 Context

ctx.request 与 ctx.response 分别承载请求和响应信息,ctx.state 可通过 Application 泛型定义请求级业务状态。

04

Web 标准互操作

请求体提供 json、text、form、formData 与 arrayBuffer 等接口,也可通过 Response.with 和 app.fetch 连接 Fetch API 生态。

05

多运行时支持

同一 JSR 包可用于 Deno、Node.js、Bun 和 Cloudflare Workers,并针对监听服务或 fetch Handler 提供对应入口。

06

完整响应辅助能力

自动推断 Content-Type,支持重定向、签名 Cookie、文件发送、ETag、中止信号和应用级错误事件。

07

实时连接能力

在受支持的运行时中可通过 sendEvents 创建 Server-Sent Events,并通过 upgrade 升级 WebSocket 连接。

08

测试与嵌入接口

app.handle 可直接处理 Web 标准 Request 并返回 Response,便于无端口单元测试或嵌入已有 HTTP 运行环境。

USE CASES

适用场景

适合 Deno API、跨运行时服务、边缘函数,以及希望以中间件方式精确控制 HTTP 生命周期的 TypeScript 项目。

Deno REST API

通过 JSR、原生 TypeScript、权限模型和内置 Router 构建无需传统 Node 工具链的接口服务。

跨运行时服务

共享主要路由与业务逻辑,并根据部署目标适配 Deno、Node.js、Bun 或 Cloudflare Workers 入口。

边缘 API

app.fetch 可作为 Cloudflare Workers Fetch Handler,用相同中间件组织认证、缓存和响应逻辑。

BFF 与网关

洋葱中间件适合实现请求追踪、权限检查、上游聚合、超时控制和统一错误格式。

服务端渲染与静态内容

Response Body、Cookie 与 send 静态文件能力可支撑轻量网站、管理后台和传统服务端页面。

实时接口

在 Deno 等支持完整能力的环境中,可通过 SSE 或 WebSocket 实现通知、事件流和双向通信。

EVALUATION

优点与注意事项

技术选型不仅要看能力,也要理解它带来的团队成本。

主要优点

Oak 擅长的地方

  • 原生 TypeScript 设计,Router 参数和应用状态能获得较好的类型推断
  • 中间件模型与 Koa 相似,错误、计时和响应后处理表达自然
  • Router、请求体解析、Cookie 和静态文件等常见能力由框架统一提供
  • 以 Request、Response、Headers 和 FormData 等 Web 标准降低运行时耦合
  • 支持 Deno、Node.js、Bun 与 Cloudflare Workers,可复用主要业务代码
  • app.handle 与 app.fetch 让测试、Fetch 集成和边缘部署更直接

需要注意

采用前应考虑的问题

跨运行时能力并非完全一致

文件发送、TLS、WebSocket Upgrade 等功能在 Node.js、Bun 和 Workers 上存在限制,不能只在 Deno 验证后直接假设完全可移植。

中间件顺序影响安全与响应

错误处理、认证、Router 和 allowedMethods 的注册顺序会改变结果,忘记 await next() 也会截断上游恢复逻辑。

输入仍需运行时验证

request.body.json() 返回的数据来自不可信客户端,TypeScript 类型不会自动验证内容,应在路由边界使用 Schema 或显式检查。

依赖来源应保持一致

优先使用 JSR 与明确版本,并提交 deno.lock;混用未经固定的 URL、npm 和 JSR 导入会增加升级与供应链管理难度。

状态策略需要提前确定

Application 的 contextState 可使用 clone、prototype、alias 或 empty,不恰当的共享方式可能造成请求之间的数据污染。

代理和 Cookie 需要安全配置

只有在可信代理拓扑下才启用 proxy,并使用足够强且可轮换的 keys 签名 Cookie,避免信任伪造的转发 Header。

生态规模小于主流 Node 框架

虽然可接入标准 TypeScript 模块,但 Oak 专用中间件、教程和第三方集成数量不如 Express 或 Koa 丰富。

QUICK START

快速开始

使用 Deno、JSR 和 Oak 17 创建带类型化状态、输入校验、错误处理与测试的最小任务 API。

1初始化 Deno 项目
bash
mkdir oak-tasks
cd oak-tasks
deno init
deno add jsr:@oak/oak jsr:@std/assert
2创建类型化 Oak 应用
typescript
import { Application, Router } from "@oak/oak";

type AppState = {
  requestId: string;
};

type TaskInput = {
  title: string;
};

function parseTaskInput(value: unknown): TaskInput {
  if (
    typeof value !== "object" ||
    value === null ||
    typeof (value as { title?: unknown }).title !== "string"
  ) {
    throw new TypeError("title must be a string");
  }

  const title = (value as { title: string }).title.trim();
  if (!title || title.length > 120) {
    throw new TypeError("title must contain 1–120 characters");
  }

  return { title };
}

export const app = new Application<AppState>();
const router = new Router<AppState>({ prefix: "/api" });

app.use(async (ctx, next) => {
  ctx.state.requestId = crypto.randomUUID();

  try {
    await next();
  } catch (error) {
    ctx.response.status = error instanceof TypeError ? 422 : 500;
    ctx.response.body = {
      error: error instanceof TypeError
        ? error.message
        : "Internal server error",
      requestId: ctx.state.requestId,
    };
  }
});

router.get("/health", (ctx) => {
  ctx.response.body = { status: "ok" };
});

router.post("/tasks", async (ctx) => {
  const input = parseTaskInput(await ctx.request.body.json());

  ctx.response.status = 201;
  ctx.response.body = {
    id: crypto.randomUUID(),
    title: input.title,
    completed: false,
  };
});

app.use(router.routes());
app.use(router.allowedMethods());
3启动 Deno HTTP 服务
typescript
import { app } from "./app.ts";

app.addEventListener("error", (event) => {
  console.error("Unhandled Oak error", event.error);
});

const controller = new AbortController();

Deno.addSignalListener("SIGINT", () => {
  controller.abort();
});

await app.listen({
  hostname: "127.0.0.1",
  port: 8000,
  signal: controller.signal,
});
4使用 Web Request 测试路由
typescript
import {
  assertEquals,
  assertExists,
} from "@std/assert";
import { app } from "./app.ts";

Deno.test("creates a task", async () => {
  const response = await app.handle(
    new Request("http://localhost/api/tasks", {
      method: "POST",
      headers: { "content-type": "application/json" },
      body: JSON.stringify({ title: "学习 Oak" }),
    }),
  );

  assertExists(response);
  assertEquals(response.status, 201);

  const task = await response.json();
  assertEquals(task.title, "学习 Oak");
  assertEquals(task.completed, false);
});
5部署为 Cloudflare Worker
typescript
import { Application, Router } from "@oak/oak";

const router = new Router();
router.get("/health", (ctx) => {
  ctx.response.body = { status: "ok" };
});

const app = new Application();
app.use(router.routes());
app.use(router.allowedMethods());

export default { fetch: app.fetch };

下一步:生产项目应在 deno.json 中锁定 JSR 依赖并提交 lockfile;如果需要跨运行时部署,还要分别验证文件、TLS、WebSocket 等能力,因为部分接口存在运行时差异。

ALTERNATIVES

类似项目

这些项目分别提供相似的中间件模型、Web 标准跨运行时能力,或 Oak 最常运行的现代 JavaScript Runtime。

COMPARISON

Oak vs Koa

Oak 的中间件与 Context 思路直接受 Koa 启发,但两者的默认运行环境和框架边界不同。Oak 以 TypeScript、Web 标准、多运行时和内置 Router 为主要方向;Koa 则以 Node.js 上的极简核心和庞大中间件生态见长。

比较维度OakKoa
主要运行环境Deno、Node.js、Bun、Cloudflare WorkersNode.js
实现语言TypeScript 原生实现与类型化状态JavaScript 核心,配套 TypeScript 类型
中间件模型Koa 风格 async 洋葱中间件async 洋葱中间件的原始设计来源
路由框架内置 Router 与 allowedMethods核心不内置,通常安装 @koa/router
请求响应接口ctx.request/response + Fetch API 互操作ctx 封装 Node req/res,并保留原生对象
内置能力Body、Cookie、静态文件、SSE、WebSocket 等保持最小核心,大多通过中间件补充
生态Deno 与跨运行时生态,规模相对较小成熟的 Node.js 中间件与长期应用案例
更适合Deno 优先、Web 标准和跨运行时服务Node.js 定制后端与成熟 npm 集成
如何选择

如果项目以 Deno 为主,或希望在 Node、Bun 与 Workers 之间复用基于 Web 标准的路由和中间件,Oak 提供了更完整的默认组合;如果系统明确运行在 Node.js、依赖成熟 npm 中间件,或希望自行选择 Router 和每个基础组件,Koa 更轻。跨运行时是 Oak 的优势,但涉及文件、TLS 或实时连接时仍应按目标环境逐项验证。

VERIFICATION

资料核验

版本、维护信息与本页采用的官方资料来源。

最后核验2026 年 7 月 26 日
核验版本官方当前稳定版与文档主线
内容维护Docs100 编辑整理
项目维护状态活跃维护

本次核验覆盖 Oak 的核心定位、主要能力、官方入口与开源许可。项目版本持续更新,具体补丁版本、兼容性和迁移要求请在采用前继续核对官方发布记录。

维护状态核验2026 年 7 月 26 日 · 最近可见代码活动:2026 年 2 月 22 日

官方仓库未归档,核验时最近可见的代码活动日期为 2026 年 2 月 22 日。该状态表示项目近期仍有公开维护活动,不代表固定发布频率或长期支持承诺。

查看官方仓库