ITSkillsCenter
تطوير الويب

Bun + Hono: بناء API REST type-safe في 2026

2 دقائق للقراءة

بناء API REST في 2026 لم يعد يقتصر على اختيار Express + Node. التركيبة Bun + Hono تقدم تجربة حديثة، type-safe، فائقة السرعة، قابلة للنقل: نفس API يمكن أن يعمل على Bun، Node.js، Deno، Cloudflare Workers، AWS Lambda، أو أي runtime JavaScript حديث. ببضعة أسطر، تحصل على routing متقدم، تحقق Zod، middleware معياري، وأداء يتجاوز Express بكثير.

راجع دليل Bun الكامل.

لماذا Hono؟

  • قابل للنقل: نفس الكود يعمل على Bun، Node، Deno، Cloudflare Workers، AWS Lambda
  • Type-safe: المسارات والمعاملات والـ body مكتوبة بالأنواع
  • أداء عالٍ: على Bun، يصل إلى 30 000-50 000 RPS
  • Middleware غني: JWT، CORS، compression، rate limiting، logger
  • تحقق Zod مدمج عبر @hono/zod-validator
  • RPC client: توليد عميل TypeScript type-safe من المسارات الخادم

الخطوة 1 — تهيئة المشروع

mkdir mon-api && cd mon-api
bun init -y
bun add hono zod @hono/zod-validator
bun add -D @types/bun

الخطوة 2 — أول خادم Hono

import { Hono } from "hono";
import { logger } from "hono/logger";
import { cors } from "hono/cors";

const app = new Hono();
app.use("*", logger());
app.use("/api/*", cors({ origin: ["https://app.exemple.sn"], credentials: true }));

app.get("/", (c) => c.text("Hono API on Bun"));
app.get("/api/health", (c) => c.json({ status: "ok", time: Date.now() }));

export default { port: 3000, fetch: app.fetch };

تشغيل: bun run --hot src/index.ts. الخيار --hot يفعل hot reload الفوري.

الخطوة 3 — CRUD مع تحقق Zod

import { Hono } from "hono";
import { zValidator } from "@hono/zod-validator";
import { z } from "zod";

const users = new Hono();

const createUserSchema = z.object({
  name: z.string().min(2).max(100),
  email: z.string().email(),
  age: z.number().int().min(13).max(120),
});

users.post("/", zValidator("json", createUserSchema), (c) => {
  const body = c.req.valid("json");
  return c.json({ id: 1, ...body }, 201);
});

users.get("/:id", (c) => {
  const id = c.req.param("id");
  return c.json({ id, name: "Aïssatou" });
});

export default users;

الخطوة 4 — مصادقة JWT

import { jwt, sign } from "hono/jwt";

const JWT_SECRET = process.env.JWT_SECRET!;

app.post("/api/auth/login", async (c) => {
  const { email, password } = await c.req.json();
  // التحقق من credentials في DB...
  const token = await sign(
    { sub: email, exp: Math.floor(Date.now() / 1000) + 3600 },
    JWT_SECRET,
  );
  return c.json({ token });
});

app.use("/api/private/*", jwt({ secret: JWT_SECRET }));

app.get("/api/private/me", (c) => {
  const payload = c.get("jwtPayload");
  return c.json({ user: payload });
});

الخطوة 5 — قاعدة بيانات (Drizzle)

للإنتاج، استخدم PostgreSQL مع Drizzle ORM. راجع درس Bun + Drizzle.

الخطوة 6 — اختبارات

import { describe, it, expect } from "bun:test";
import app from "../index";

describe("Users API", () => {
  it("GET /api/users يعيد مصفوفة", async () => {
    const res = await app.request("/api/users");
    expect(res.status).toBe(200);
  });
});

الخطوة 7 — RPC client type-safe

import { hc } from "hono/client";
import type { AppType } from "./index";

const client = hc<AppType>("https://api.exemple.sn");
const res = await client.api.users.$post({
  json: { name: "X", email: "x@y.sn", age: 30 },
});
const user = await res.json(); // مكتوب تلقائياً

الخطوة 8 — النشر

  • Coolify بـ Nixpacks: نشر بنقرة من Git
  • VPS مع systemd
  • Cloudflare Workers بدون تعديل تقريباً

التكييف للسوق العربي وغرب أفريقيا

للشركات الصغيرة التي تبني API أعمال (مخزون، فوترة Wave/OM، تطبيق داخلي)، Bun + Hono يسمح بدعم 5 000-10 000 مستخدم متزامن على VPS Hetzner CX22 (4 يورو/شهر). توفير سنوي 50-100 يورو لكل مشروع.

أخطاء شائعة

الخطأالسببالحل
CORS مرفوضorigin مفقودإضافة النطاق في cors origin
JWT 401 دائماًJWT_SECRET مختلفتوحيد قراءة المتغير
Zod لا يحول الأنواعparam URL دائماً stringz.coerce.number()

لمعرفة المزيد

Besoin d'un site web ?

Confiez-nous la Création de Votre Site Web

Site vitrine, e-commerce ou application web — nous transformons votre vision en réalité digitale. Accompagnement personnalisé de A à Z.

À partir de 250.000 FCFA
Parlons de Votre Projet
Publicité