Routing & Parameters
Bunstone uses decorators to define routes and extract parameters from requests.
@Controller()
Defines a class as a controller with an optional base path.
typescript
@Controller("users")
export class UserController {
@Get(":id")
findOne(@Param("id") id: string) {
return { id };
}
}HTTP Methods
@Get(path?)@Post(path?)@Put(path?)@Delete(path?)@Patch(path?)
Parameter Decorators
Extract data directly into your method arguments:
@Param(name?): Path parameters.@Query(name?): Query string parameters.@Body(schema?): Request body (supports Zod validation).@Header(name): Request headers.@Request(): The full Elysia request object.
Zod Validation
You can pass a Zod schema to @Body, @Query, or @Param for automatic validation.
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
}Practical Example
See more examples of routing, parameters, and validation:
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 = AppStartup.create(AppModule);
app.listen(3000, () => {
console.log("Routing example is running on http://localhost:3000");
});