# Middlewares and Params

## How middleware works?

![How middleware works](https://3560755491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FHts9egaBIQFAK8US18Eu%2Fuploads%2FtnbOSxpcqXnkKGARYsg6%2FHow%20middleware%20works.jpeg?alt=media\&token=5bf51238-651b-46db-bfad-f1da939d01ca)

When the bot gets update, it completes all middlewares, and only then completes a handler. For example, using middlewares, you can auth user and pass some params to the handler

## Creating middleware

Let's create `logger.middleware.ts` file. It will be the middleware that will log received update. We will then apply this middleware

{% hint style="info" %}
You can move middleware to different position

You can read more about `Answer` class [here](https://degreetpro.gitbook.io/nestgram/nestgram-features/answer-class)
{% endhint %}

{% code title="logger.middleware.ts" %}

```typescript
export function LoggerMiddleware(
  update: IUpdate, // received update
  answer: Answer, // Answer (you can send a message)
  params: any, // Params (you can pass params to the handler)
  next: NextFunction, // next function (it can be next middleware or handler)
  fail: NextFunction, // fail function (you need to call it if you don't want to call handler)
) {
  params.someParam = 1; // set some param that we want to get in handler
  console.log(update); // log received update
  next(); // call handler
}
```

{% endcode %}

{% code title="app.controller.ts" %}

```typescript
import { OnText, Controller, Params } from 'nestgram';
import { LoggerMiddleware } from './logger.middleware';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService?: AppService) {}

  @OnText()
  @Middleware(LoggerMiddleware)
  async handleText(@Params() params: any): Promise<string> {
    console.log(params);
    return 'Hello, world!';
  }
}
```

{% endcode %}

## Global middlewares

You can apply middleware for all controller, if you are uncomfortable to set it for every handler

{% code title="app.module.ts" %}

```typescript
import { Module } from 'nestgram';
import { LoggerMiddleware } from './logger.middleware.ts';

import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  controllers: [AppController],
  services: [AppService],
  middlewares: [LoggerMiddleware],
})
export class AppModule {}
```

{% endcode %}
