Middleware
Глобальный и маршрутный middleware для 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 (создаётся при отсутствии). 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.