Skip to content

Parameter decorators

Below is the complete list of decorators available in a Controller Context.

Existing decorators

Decorator Description
@Body() returns ctx.request.body or ctx.body if previous one is undefined
@Param(name: string) Returns the value of an URL parameter (ex : /:id)
@Params() Returns all the url params
@Query() Returns all the query parameters
@QueryParam(name: string) Returns the value of a query param (ex : /:id)
@Ip() Returns ctx.ip
@Origin() Returns ctx.origin
@Method() Returns the HTTP Method ctx.method
@Ctx() Returns Koa-router ctx (RouterContext)
@Args() Special NFW decorator, it returns the args passed to a ResponseHandler or a Guard
@ControllerContext() Special NFW decorator, it returns the current ControllerContext infos (controllerAction and controllerInstance)

Creating a custom decorator

You can add your own decorators using createCustomDecorator(handle: (ctx: ControllerParamsContext) => unknown, name: string).

  • handle : the function that will be executed to get a value for the decorator. This function passes the Koa context and the arguments passed to the decorator.
  • name : The name of the decorator.
decorator/current-user.decorator.ts
export function  CurrentUser(this: unknown,  throwIfNotFound: boolean) {
  return createCustomDecorator(async ({ ctx , args }) => {
    const databaseConnection = container.resolve<MikroORM>(databaseInjectionToken);
    const context = databaseConnection.em.getContext();
    const user = await context.getRepository(UserModel).findOne({ id: "amaury" });
    if (!user && throwIfNotFound) {
        throw new Error("User not found");
    }
    return user;
  }, 'current-user');
}

The decorator can then be called like any other decorator in a Controller Context.

controller/user.controller.ts
@Controller('/users')
export class UsersController {
  @GET('/profile')
  profile (@CurrentUser(false) currentUser: UserModel) {
    return currentUser;
  }
}

Danger

At the moment, the response of the decorator is not cached. If a decorator is used once in the guard and once in the controller, it will be called twice.