Перейти к основному содержимому

Middleware

Middleware - это функция которая вызывается до и после выполнения action у controller. Внимание, в отличии от Hook, Middleware ограниченно поддерживает DI, так как регистрируется на верхнем уровне в месте с самим приложением.

В Alosaur Middlware имеет следующий интерфейс:

export type IMiddleware<TState = unknown> =  | PreRequestMiddleware<TState>  | PostRequestMiddleware<TState>  | MiddlewareTarget<TState>;
export interface PreRequestMiddleware<TState = unknown> {  onPreRequest(context: HttpContext<TState>): void;}
export interface PostRequestMiddleware<TState = unknown> {  onPreRequest(context: HttpContext<TState>): void;}
export interface MiddlewareTarget<TState = unknown> {  onPreRequest(context: HttpContext<TState>): void;  onPostRequest(context: HttpContext<TState>): void;}

Для того чтобы зарегистрировать свой Middlware вы можете с помощью декоратора @Middleware передав внутрь Regexp роута, на котором вы бы хотели чтобы ваш Middleware сработал.

Пример простого Middlware:

@Middleware(new RegExp("/"))export class Log implements MiddlewareTarget<TState> {  date: Date = new Date();
  onPreRequest(context: Context<TState>) {    return new Promise<void>((resolve, reject) => {      this.date = new Date();      resolve();    });  }
  onPostRequest(context: Context<TState>) {    return new Promise<void>((resolve, reject) => {      console.log(new Date().getTime() - this.date.getTime());      resolve();    });  }}

Далее вы можете регистрировать его на уровне AppSettings или же после инициализации:

const settings: AppSettings = {  areas: [HomeArea, InfoArea],  middlewares: [Log], // The order in this array corresponds to the order of the run middleware};
// or in app use:
const app = new App(settings);app.use(/\//, new Log());
tip

Так же вы можете посмотреть более сложные в исполнении Middleware в разделах WebSocket или SSE.