Hono.js + Next.js
2026年9月6日
来源教程这一页当时是空的。下面按 Hono 官方和 Next 集成,记一套能用的接法。
route.ts 适合少量接口。接口一多、要共享校验 / 日志 / CORS 时,把 Hono 嵌进一个 catch-all 更干净:路由树、中间件、RPC 类型都还在 Hono 那套里,部署仍跟 Next 走。
安装
pnpm add hono
bash
挂到 /api
app/api/[[...route]]/route.ts(可选 catch-all,/api 本身也能命中):
import { Hono } from "hono";
import { handle } from "hono/vercel";
const app = new Hono().basePath("/api");
app.get("/health", (c) => c.json({ ok: true }));
app.get("/users/:id", (c) => {
const id = c.req.param("id");
return c.json({ id });
});
export const GET = handle(app);
export const POST = handle(app);
export const PUT = handle(app);
export const PATCH = handle(app);
export const DELETE = handle(app);
ts
basePath('/api') 要和文件夹前缀一致,否则匹配会偏一层。
中间件
import { cors } from "hono/cors";
import { logger } from "hono/logger";
app.use("*", logger());
app.use(
"/admin/*",
cors({ origin: "https://example.com", credentials: true })
);
app.use("/admin/*", async (c, next) => {
const token = c.req.header("authorization");
if (token !== `Bearer ${process.env.ADMIN_TOKEN}`) {
return c.json({ error: "unauthorized" }, 401);
}
await next();
});
ts
分组、app.route('/v1', v1) 和独立 Hono 应用一样。Prisma、Better Auth 的 handler 也可以 app.on(['GET', 'POST'], '/auth/*', ...) 转过去,或继续把 Auth 留在 /api/auth/[...all]。
和 Server Actions 怎么分工
| 用谁 | |
|---|---|
| 同站表单、要渐进增强 | Server Actions |
| 给 App / 第三方的 HTTP API | Hono 或 route.ts |
| 只要两三个 webhook | 单文件 Route Handler 就够 |
Hono 跑在 Node / Edge 取决于你 export 的 runtime。用 Node API(fs、某些 SDK)时别标 export const runtime = 'edge'。
下一篇:用 Prisma 把 SQL 收成类型安全的客户端。