Tecnologia

NestJS: construindo uma API REST pronta para produção

17 de fevereiro de 202614 min de leitura

NestJS é o framework Node.js que mais se aproxima de uma experiência "enterprise" — com injeção de dependência, módulos, e uma arquitetura que escala. Mas um nest new está longe de estar pronto para produção. Veja o que falta.

1. Validação com class-validator

import { IsEmail, IsNotEmpty, MinLength } from 'class-validator';

export class CreateUserDto {
  @IsNotEmpty({ message: 'Nome é obrigatório' })
  name: string;

  @IsEmail({}, { message: 'E-mail inválido' })
  email: string;

  @MinLength(8, { message: 'Senha deve ter no mínimo 8 caracteres' })
  password: string;
}

Habilite a validação global no main.ts:

app.useGlobalPipes(new ValidationPipe({
  whitelist: true,        // remove campos não declarados
  forbidNonWhitelisted: true,  // retorna erro se enviar campo extra
  transform: true,        // converte tipos automaticamente
}));

2. Autenticação JWT

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor(private usersService: UsersService) {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      secretOrKey: process.env.JWT_SECRET,
    });
  }

  async validate(payload: JwtPayload) {
    const user = await this.usersService.findById(payload.sub);
    if (!user) throw new UnauthorizedException();
    return user;
  }
}

3. Rate limiting

import { ThrottlerModule } from '@nestjs/throttler';

@Module({
  imports: [
    ThrottlerModule.forRoot({
      throttlers: [{ ttl: 60000, limit: 100 }],
    }),
  ],
})
export class AppModule {}

4. Logging estruturado

Use Pino para logs em JSON (muito mais fácil de parsear no CloudWatch/Datadog):

import { LoggerModule } from 'nestjs-pino';

LoggerModule.forRoot({
  pinoHttp: {
    level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',
    transport: process.env.NODE_ENV !== 'production'
      ? { target: 'pino-pretty' }
      : undefined,
  },
})

5. Testes

describe('UsersController', () => {
  let controller: UsersController;
  let service: UsersService;

  beforeEach(async () => {
    const module = await Test.createTestingModule({
      controllers: [UsersController],
      providers: [
        {
          provide: UsersService,
          useValue: {
            findAll: jest.fn().mockResolvedValue([mockUser]),
            create: jest.fn().mockResolvedValue(mockUser),
          },
        },
      ],
    }).compile();

    controller = module.get(UsersController);
    service = module.get(UsersService);
  });

  it('should return all users', async () => {
    const result = await controller.findAll();
    expect(result).toEqual([mockUser]);
  });
});

Checklist de produção

  • [ ] Validação global com whitelist
  • [ ] Autenticação JWT + refresh tokens
  • [ ] Rate limiting por IP e por usuário
  • [ ] CORS configurado (não use * em produção)
  • [ ] Helmet para headers de segurança
  • [ ] Logging estruturado em JSON
  • [ ] Health check endpoint (/health)
  • [ ] Graceful shutdown
  • [ ] Testes unitários + e2e
  • [ ] Variáveis de ambiente validadas (usando @nestjs/config + Joi)

NestJS é nossa escolha padrão para APIs Node.js na NexCript. A estrutura modular permite que novos devs sejam produtivos rapidamente — e que o código se mantenha organizado conforme o projeto cresce.

Compartilhar
Voltar ao blog