Skip to main content

hono

Use when building Hono web applications or when the user asks about Hono APIs, routing, middleware, JSX, validation, testing, or streaming. TRIGGER when code imports from 'hono' or 'hono/*', or user mentions Hono. Use `npx hono request` to test endpoints.

ソース情報

リポジトリ
arvindrk/twitter-agent
ソースの最終更新活動
2026年5月2日 20:09
検出された SKILL.md の言語
英語
スター
4
フォーク
3

インストール方法

デフォルトでは、最初にソースを確認する Prompt が選択されています。直接コマンドに切り替えるか、ローカルコピーをダウンロードすることもできます。

ソースファイルを確認

インストールを決める前に、SKILL.md と SkillsMP に表示されている付属ファイルをお読みください。

SKILL.md を表示中

SKILL.md
ソースの指示 · 読み取り専用プレビュー
name
hono
description
Use when building Hono web applications or when the user asks about Hono APIs, routing, middleware, JSX, validation, testing, or streaming. TRIGGER when code imports from 'hono' or 'hono/*', or user mentions Hono. Use `npx hono request` to test endpoints.
# Hono Skill Build Hono web applications. This skill provides inline API knowledge for AI. Use `npx hono request` to test endpoints. If the `hono-docs` MCP server is configured, prefer its tools for the latest documentation over the inline reference. ## Hono CLI Usage ### Request Testing Test endpoints without starting an HTTP server. Uses `app.request()` internally. ```bash # GET request npx hono request [file] -P /path # POST request with JSON body npx hono request [file] -X POST -P /api/users -d '{"name": "test"}' ``` **Note:** Do not pass credentials directly in CLI arguments. Use environment variables for sensitive values. `hono request` does not support Cloudflare Workers bindings (KV, D1, R2, etc.). When bindings are required, use `workers-fetch` instead: ```bash npx workers-fetch /path npx workers-fetch -X POST -H "Content-Type:application/json" -d '{"name":"test"}' /api/users ``` --- ## Hono API Reference ### App Constructor ```ts import { Hono } from "hono"; const app = new Hono(); // With TypeScript generics type Env = { Bindings: { DATABASE: D1Database; KV: KVNamespace }; Variables: { user: User }; }; const app = new Hono<Env>(); ``` ### Routing Methods ```ts app.get("/path", handler); app.post("/path", handler); app.put("/path", handler); app.delete("/path", handler); app.patch("/path", handler); app.options("/path", handler); app.all("/path", handler); // all HTTP methods app.on("PURGE", "/path", handler); // custom method app.on(["PUT", "DELETE"], "/path", handler); // multiple methods ``` ### Routing Patterns ```ts // Path parameters app.get("/user/:name", (c) => { const name = c.req.param("name"); return c.json({ name }); }); // Multiple params app.get("/posts/:id/comments/:commentId", (c) => { const { id, commentId } = c.req.param(); }); // Optional parameters app.get("/api/animal/:type?", (c) => c.text("Animal!")); // Wildcards app.get("/wild/*/card", (c) => c.text("Wildcard")); // Regexp constraints app.get("/post/:date{[0-9]+}/:title{[a-z]+}", (c) => { const { date, title } = c.req.param(); }); // Chained routes app.get("/endpoint", (c) => c.text("GET")) .post((c) => c.text("POST")) .delete((c) => c.text("DELETE")); ``` ### Route Grouping ```ts // Using route() const api = new Hono(); api.get("/users", (c) => c.json([])); const app = new Hono(); app.route("/api", api); // mounts at /api/users // Using basePath() const app = new Hono().basePath("/api"); app.get("/users", (c) => c.json([])); // GET /api/users ``` ### Error Handling ```ts app.notFound((c) => c.json({ message: "Not Found" }, 404)); app.onError((err, c) => { console.error(err); return c.json({ message: "Internal Server Error" }, 500); }); ``` --- ## Context (c) ### Response Methods ```ts c.text("Hello"); // text/plain c.json({ message: "Hello" }); // application/json c.html("<h1>Hello</h1>"); // text/html c.redirect("/new-path"); // 302 redirect c.redirect("/new-path", 301); // 301 redirect c.body("raw body", 200, headers); // raw response c.notFound(); // 404 response ``` ### Headers & Status ```ts c.status(201); c.header("X-Custom", "value"); c.header("Cache-Control", "no-store"); ``` ### Variables (request-scoped data) ```ts // In middleware c.set("user", { id: 1, name: "Alice" }); // In handler const user = c.get("user"); // or const user = c.var.user; ``` ### Environment (Cloudflare Workers) ```ts const value = await c.env.KV.get("key"); const db = c.env.DATABASE; c.executionCtx.waitUntil(promise); ``` ### Renderer ```ts app.use(async (c, next) => { c.setRenderer((content) => c.html( <html><body>{content}</body></html> ) ) await next() }) app.get('/', (c) => c.render(<h1>Hello</h1>)) ``` --- ## HonoRequest (c.req) ```ts c.req.param("id"); // path parameter c.req.param(); // all path params as object c.req.query("page"); // query string parameter c.req.query(); // all query params as object c.req.queries("tags"); // multiple values: ?tags=A&tags=B → ['A', 'B'] c.req.header("Authorization"); // request header c.req.header(); // all headers (keys are lowercase) // Body parsing await c.req.json(); // parse JSON body await c.req.text(); // parse text body await c.req.formData(); // parse as FormData await c.req.parseBody(); // parse multipart/form-data or urlencoded await c.req.arrayBuffer(); // parse as ArrayBuffer await c.req.blob(); // parse as Blob // Validated data (used with validator middleware) c.req.valid("json"); c.req.valid("query"); c.req.valid("form"); c.req.valid("param"); // Properties c.req.url; // full URL string c.req.path; // pathname c.req.method; // HTTP method c.req.raw; // underlying Request object ``` --- ## Middleware ### Using Built-in Middleware ```ts import { cors } from "hono/cors"; import { logger } from "hono/logger"; import { basicAuth } from "hono/basic-auth"; import { prettyJSON } from "hono/pretty-json"; import { secureHeaders } from "hono/secure-headers"; import { etag } from "hono/etag"; import { compress } from "hono/compress"; import { poweredBy } from "hono/powered-by"; import { timing } from "hono/timing"; import { cache } from "hono/cache"; import { bearerAuth } from "hono/bearer-auth"; import { jwt } from "hono/jwt"; import { csrf } from "hono/csrf"; import { ipRestriction } from "hono/ip-restriction"; import { bodyLimit } from "hono/body-limit"; import { requestId } from "hono/request-id"; import { methodOverride } from "hono/method-override"; import { trailingSlash, trimTrailingSlash } from "hono/trailing-slash"; // Registration app.use(logger()); // all routes app.use("/api/*", cors()); // specific path app.post("/api/*", basicAuth({ username: "admin", password: "secret" })); ``` ### Custom Middleware ```ts // Inline app.use(async (c, next) => { const start = Date.now(); await next(); const elapsed = Date.now() - start; c.res.headers.set("X-Response-Time", `${elapsed}ms`); }); // Reusable with createMiddleware import { createMiddleware } from "hono/factory"; const auth = createMiddleware(async (c, next) => { const token = c.req.header("Authorization"); if (!token) return c.json({ error: "Unauthorized" }, 401); await next(); }); app.use("/api/*", auth); ``` ### Middleware Execution Order Middleware executes in registration order. `await next()` calls the next middleware/handler, and code after `next()` runs on the way back: ``` Request → mw1 before → mw2 before → handler → mw2 after → mw1 after → Response ``` ```ts app.use(async (c, next) => { // before handler await next(); // after handler }); ``` --- ## Validation Validation targets: `json`, `form`, `query`, `header`, `param`, `cookie`. ### Zod Validator ```ts import { zValidator } from "@hono/zod-validator"; import { z } from "zod"; const schema = z.object({ title: z.string().min(1), body: z.string(), }); app.post("/posts", zValidator("json", schema), (c) => { const data = c.req.valid("json"); // fully typed return c.json(data, 201); }); ``` ### Valibot / Standard Schema Validator ```ts import { sValidator } from "@hono/standard-validator"; import * as v from "valibot"; const schema = v.object({ name: v.string(), age: v.number() }); app.post("/users", sValidator("json", schema), (c) => { const data = c.req.valid("json"); return c.json(data, 201); }); ``` --- ## JSX ### Setup In `tsconfig.json`: ```json { "compilerOptions": { "jsx": "react-jsx", "jsxImportSource": "hono/jsx" } } ``` Or use pragma: `/** @jsxImportSource hono/jsx */` **Important:** Files using JSX must have a `.tsx` extension. Rename `.ts` to `.tsx` or the compiler will fail. ### Components ```tsx import type { PropsWithChildren } from "hono/jsx"; const Layout = (props: PropsWithChildren) => ( <html> <head> <title>My App</title> </head> <body>{props.children}</body> </html> ); const UserCard = ({ name }: { name: string }) => (
GitHubで見る
この SKILL.md は非常に大きいため、SkillsMP では最初のセクションだけを表示しています。 GitHubで見る