Middleware
Middleware سراسری و روی route برای Node.js — بدون پیشفرض فریمورک
نمای کلی
همان مدل Python:
(request, callNext) => response | callNext(request)هیچ middleware پیشفرضی نیست. سراسری در main.ts ثبت کنید یا per-route با route(..., { middleware, roles }).
دو لایه
- Global —
app.use(mw)از آرایهٔMIDDLEWARE - Route —
middleware: [...]یاroles: [...]رویroute
ترتیب: اول global، بعد route، بعد handler.
ثبت در main.ts
import { FusionApp, getSettings, settings, bearerJwt } from "fusion-framework";
const MIDDLEWARE = [
// bearerJwt(), // optional
];
settings.ensureLoaded();
const app = new FusionApp(getSettings());
for (const mw of MIDDLEWARE) app.use(mw);
await app.listen();نوشتن middleware
function requireApiKey(request, callNext) {
const key = request.headers?.["x-api-key"];
if (key !== "secret") {
return { status: 401, body: { detail: "invalid api key" } };
}
return callNext(request);
}داده را از طریق request.state به اشتراک بگذارید (اگر نباشد ساخته میشود). Handlerها از this.state میخوانند.
Middleware / roles سطح route
route("/api/admin", { roles: ["admin", "super_admin"] })(
class AdminModule extends FusionBaseApi {
get() {
return this.response({ user: this.state.jwt?.sub });
}
},
);ابزارها:
import { bearerJwt, requireRoles } from "fusion-framework";
bearerJwt({ verify, stateKey: "jwt", header: "Authorization" });
requireRoles("admin");
requireRoles({ roles: ["admin"], claim: "roles", stateKey: "jwt" });bearerJwt پیشفرض payload JWT را بدون verify رمزنگاری، با base64url decode میکند — برای production مقدار verify بدهید.
Async
Middleware میتواند async باشد و await callNext(request) کند. Handlerها هم میتوانند async باشند.