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");
});