Controllers processam requisições HTTP recebidas e retornam respostas. Eles são decorados com @Controller() e usam decoradores de métodos HTTP para definir rotas.
Definindo um Controller
import { Controller, Get } from "nestelia";
@Controller("/cats")
class CatController {
@Get("/")
findAll() {
return [{ name: "Tom" }, { name: "Garfield" }];
}
}O decorador @Controller("/cats") define o prefixo de rota. O decorador @Get("/") mapeia GET /cats/ para findAll().
Registrando Controllers
Controllers devem ser declarados em um módulo:
@Module({
controllers: [CatController],
providers: [CatService],
})
class CatModule {}Injetando Services
Use @Inject() no construtor para acessar services do container de DI:
@Controller("/cats")
class CatController {
constructor(@Inject(CatService) private readonly catService: CatService) {}
@Get("/")
findAll() {
return this.catService.findAll();
}
}Métodos de Rota
O nestelia fornece decoradores para todos os métodos HTTP padrão:
@Controller("/items")
class ItemController {
@Get("/") findAll() { /* ... */ }
@Get("/:id") findOne() { /* ... */ }
@Post("/") create() { /* ... */ }
@Put("/:id") update() { /* ... */ }
@Patch("/:id") patch() { /* ... */ }
@Delete("/:id") remove() { /* ... */ }
@Options("/") options() { /* ... */ }
@Head("/") head() { /* ... */ }
@All("/wild") any() { /* ... */ }
}Retornando Respostas
Métodos de controller podem retornar:
- Objetos simples / arrays — serializados para JSON automaticamente
- Strings — retornadas como texto simples
- Promises — aguardadas e então serializadas
@Get("/")
async findAll() {
const users = await this.userService.findAll();
return users; // serializado para JSON
}Acessando Dados da Requisição
Use @Ctx() para obter o contexto completo do Elysia, que fornece acesso a todos os dados da requisição:
@Get("/:id")
findOne(@Ctx() ctx: any) {
const id = ctx.params.id;
const q = ctx.query.q;
return this.service.findById(id);
}Para acesso tipado e validado ao body, params e query, use os decoradores baseados em TypeBox:
import { t } from "elysia";
@Post("/")
create(@Body(t.Object({ name: t.String() })) body: { name: string }) {
return this.userService.create(body);
}Veja Decoradores de Parâmetro para mais detalhes.
Definindo Códigos de Status
Use @HttpCode() para definir um código de status personalizado para uma rota:
@Post("/")
@HttpCode(201)
create(@Body(t.Object({ name: t.String() })) body: { name: string }) {
return this.userService.create(body);
}Ou use o contexto do Elysia para códigos de status dinâmicos:
@Post("/")
create(@Ctx() ctx: any, @Body(t.Object({ name: t.String() })) body: { name: string }) {
ctx.set.status = 201;
return this.userService.create(body);
}Definindo Headers de Resposta
Use @Header() para adicionar headers de resposta estáticos:
@Get("/")
@Header("Cache-Control", "no-store")
findAll() {
return this.service.findAll();
}