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.