Skip to content
Download

Roteamento & Parâmetros

Bunstone usa decorators para definir rotas e extrair parâmetros das requisições.

@Controller()

Define uma classe como um controller com um caminho base opcional.

typescript
@Controller("users")
export class UserController {
  @Get(":id")
  findOne(@Param("id") id: string) {
    return { id };
  }
}

Métodos HTTP

  • @Get(path?)
  • @Post(path?)
  • @Put(path?)
  • @Delete(path?)
  • @Patch(path?)

Decorators de Parâmetros

Extraia dados diretamente para os argumentos do seu método:

  • @Param(name?): Parâmetros de rota.
  • @Query(name?): Parâmetros de query string.
  • @Body(schema?): Corpo da requisição (suporta validação com Zod).
  • @Header(name): Cabeçalhos da requisição.
  • @Request(): O objeto completo de requisição do Elysia.

Personalização da Resposta

@SetResponseHeader(name, value)

Define um cabeçalho personalizado para a resposta.

typescript
@Get("xml")
@SetResponseHeader("Content-Type", "text/xml")
getXml() {
  return "<xml><message>Hello</message></xml>";
}

Validação com Zod

Você pode passar um schema Zod para @Body, @Query ou @Param para validação automática.

typescript
const CreateUserSchema = z.object({
  name: z.string(),
  age: z.number()
});

@Post()
create(@Body(CreateUserSchema) data: z.infer<typeof CreateUserSchema>) {
  return data; // data is already validated and typed
}

Exemplo Prático

Veja mais exemplos de roteamento, parâmetros e validação:

ts
import {
  Module,
  Controller,
  Get,
  Post,
  Param,
  Query,
  Body,
  AppStartup,
} from "../../index";
import { z } from "zod";

const CreateUserSchema = z.object({
  name: z.string().min(3),
  email: z.string().email(),
  age: z.number().optional(),
});

@Controller("users")
class UserController {
  @Post()
  createUser(@Body(CreateUserSchema) body: z.infer<typeof CreateUserSchema>) {
    return {
      message: "User created successfully",
      user: body,
    };
  }

  @Get(":id")
  getUser(@Param("id") id: string) {
    return { id, name: "John Doe" };
  }

  @Get()
  searchUsers(@Query("name") name: string) {
    return {
      query: name,
      results: [
        { id: "1", name: "John Doe" },
        { id: "2", name: "Jane Doe" },
      ].filter((u) =>
        u.name.toLowerCase().includes((name || "").toLowerCase())
      ),
    };
  }
}

@Module({
  controllers: [UserController],
})
class AppModule {}

const app = await AppStartup.create(AppModule);
app.listen(3000, () => {
  console.log("Routing example is running on http://localhost:3000");
});

Veja no GitHub

Distribuído sob a Licença MIT.