DocsRoteador modular
Nexy e NestJS
O roteador modular é inspirado em NestJS: controladores, módulos e injeção de construtor. É uma camada fina sobre FastAPI, portanto não tenta reproduzir tudo de NestJS. Esta página lista ambos os lados.
O que combina
| NestJS | Nexy |
|---|---|
@Controller('users') |
@Controller("/users") |
@Module({ controllers, providers, imports, exports }) |
@Module() com os mesmos quatro atributos de classe |
@Injectable() |
@Injectable() |
| Injeção de construtor | __init__ parâmetros resolvidos a partir de anotações de tipo |
| Singleton, solicitação e escopos transitórios | Scope.SINGLETON, Scope.REQUEST, Scope.TRANSIENT |
@UseGuards(AuthGuard) |
@UseGuard(guard) (uma dependência FastAPI) |
@ApiOperation, @ApiResponse (arrogância) |
@UseRoute, @UseResponse (OpenAPI, servido em /docs) |
| WebSocket portais | async def SOCKET(...) em um controlador |
Validação DTO (class-validator) |
Pydantic modelos, nativos de FastAPI |
| Detecção de dependência circular | RecursionError nomeando a classe |
O mesmo controlador e seu serviço injetado, NestJS primeiro:
@Injectable()export class UsersService { findAll() { return [{ id: 1, name: "Ada" }]; }} @Controller("users")export class UsersController { constructor(private readonly users: UsersService) {} @Get() findAll() { return this.users.findAll(); }}from nexy.decorators import Controller, Injectable @Injectable()class UserService: def find_all(self) -> list[dict]: return [{"id": 1, "name": "Ada"}] @Controller("/users")class UserController: def __init__(self, users: UserService) -> None: self.users = users async def get(self) -> list[dict]: return self.users.find_all()O que difere
- Handlers são métodos nomeados após o verbo HTTP (
get,post...), um por controlador. - Guardas e decoradores de middleware são FastAPI
Depends, não classes comcanActivate. - Parâmetros (
@Body,@Param,@Query) são parâmetros FastAPI: anotações de tipo,Query,Path,Body. - Pipes são Pydantic validação e FastAPI dependências.
@Query(), um DTO e uma classe de guarda tornam-se uma anotação, um modelo Pydantic e uma função:
from fastapi import Header, HTTPException, Queryfrom pydantic import BaseModelfrom nexy.decorators import Controller, UseGuard class NewPost(BaseModel): title: str def require_token(x_token: str = Header(...)) -> None: if x_token != "secret": raise HTTPException(status_code=403, detail="Forbidden") @Controller("/posts")@UseGuard(require_token)class PostController: async def get(self, limit: int = Query(10)) -> list[dict]: return [] async def post(self, body: NewPost) -> dict: return {"title": body.title}O que está faltando
| NestJS recurso | Status em Nexy |
|---|---|
Provedores personalizados (useValue, useFactory, useClass, tokens de string) |
não disponível: apenas @Injectable() turmas |
| Injetando por interface ou classe abstrata | não disponível |
| Encapsulamento de módulo | não aplicado: o contêiner abrange todo o processo, exports controla apenas a resolução antecipada |
Módulos dinâmicos e globais (forRoot, @Global) |
não disponível |
Ganchos de ciclo de vida (onModuleInit, onApplicationShutdown) |
não disponível |
| Interceptadores | use middleware ASGI (useMiddlewares) ou dependências |
| Filtros de exceção | use manipuladores de exceção FastAPI |
| Módulo de teste com substituições de provedor | nenhuma API pública; use FastAPI dependency_overrides e TestClient |
| Módulo de configuração, agendamento, filas, CQRS, microsserviços, cache | não faz parte da Nexy; use o ecossistema Python |
No lugar de um provedor useFactory, uma função simples atrás de Depends, que um teste substitui por dependency_overrides:
from fastapi import Dependsfrom nexy.decorators import Controller def get_settings() -> dict: return {"currency": "EUR"} @Controller("/reports")class ReportController: async def get(self, settings: dict = Depends(get_settings)) -> dict: return {"currency": settings["currency"]}Quando escolher
Escolha o roteador modular quando desejar uma estrutura baseada em classes com injeção para uma API maior. Escolha o roteador baseado em arquivo quando a estrutura da URL for o princípio de organização. Ambos são estruturados por nx new, executados na mesma aplicação FastAPI e podem coexistir.