بناء 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 دائماً string | z.coerce.number() |