Логотип Fusion Framework от Cipher UnitFusion

Middleware

Глобальный и маршрутный middleware для Node.js — без значений по умолчанию от фреймворка

Обзор

Та же модель, что в Python:

(request, callNext) => response | callNext(request)

Нет middleware по умолчанию. Регистрируйте глобально в main.ts или per-route через route(..., { middleware, roles }).

Два уровня

  1. Global — app.use(mw) из массива MIDDLEWARE
  2. 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 (создаётся при отсутствии). Handlers читают 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 });
    }
  },
);

Helpers:

import { bearerJwt, requireRoles } from "fusion-framework";

bearerJwt({ verify, stateKey: "jwt", header: "Authorization" });
requireRoles("admin");
requireRoles({ roles: ["admin"], claim: "roles", stateKey: "jwt" });

По умолчанию bearerJwt декодирует payload JWT через base64url без криптографической проверки — для production передайте verify.

Async

Middleware может быть async и делать await callNext(request). Handlers тоже могут быть async.

На этой странице