Skip to content

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

See it on GitHub

Released under the MIT License.