Logo

Publicado

- 3 min read

Criando uma API com Node.js e TypeScript usando DDD

img of Criando uma API com Node.js e TypeScript usando DDD

Introdução

O desenvolvimento de APIs se tornou uma habilidade essencial para programadores na era digital. Com a crescente demanda por aplicações que consomem e expõem dados através de APIs, dominar a construção de uma API eficaz é crucial. Neste post, vamos explorar como criar uma API usando Node.js e TypeScript, seguindo o padrão de projeto Domain-Driven Design (DDD). O DDD é uma abordagem que estrutura o projeto de software em torno do domínio do negócio, facilitando manutenção e escalabilidade.


Pré-requisitos

Para acompanhar este tutorial você vai precisar de:

  • Conhecimentos básicos em JavaScript e TypeScript.
  • Familiaridade com Node.js e npm (Node Package Manager).
  • um editor de código, como VSCode.
  • Ferramentas de teste de API, como Postman ou Insomnia.

Conceitos Principais

O que é DDD?

O Domain-Driven Design é um padrão que tem como foco a modelagem do negócio. Ele incentiva a colaboração entre desenvolvedores e especialistas no domínio para criar um modelo de software que reflete as regras de negócio. O DDD divide a aplicação em camadas, como:

  • Domínio: Representa as regras e lógica do negócio.
  • Aplicação: Orquestra a interação entre os componentes do domínio.
  • Infraestrutura: Interage com o ambiente externo, como bancos de dados e serviços.

Estrutura Básica de um Projeto DDD

A estrutura recomendada para um projeto DDD em Node.js pode ser assim:

   /src
  ├── application
  ├── domain
  ├── infrastructure
  └── presentation

Exemplo de Código

Abaixo está um exemplo simples de um modelo de domínio e serviço:

   // src/domain/user.ts
export class User {
	constructor(
		public id: string,
		public name: string
	) {}
}

// src/application/userService.ts
import { User } from '../domain/user'

export class UserService {
	private users: User[] = []

	public createUser(name: string): User {
		const newUser = new User(String(this.users.length + 1), name)
		this.users.push(newUser)
		return newUser
	}

	public getUsers(): User[] {
		return this.users
	}
}

Mini-Projeto Prático

Criando a API

  1. Configuração do Projeto:
   mkdir ddd-api-example
cd ddd-api-example
npm init -y
npm install typescript ts-node express @types/express
npx tsc --init
  1. Criar o Servidor Express:
   // src/index.ts
import express from 'express'
import { UserService } from './application/userService'

const app = express()
const userService = new UserService()
app.use(express.json())

app.post('/users', (req, res) => {
	const user = userService.createUser(req.body.name)
	res.status(201).json(user)
})

app.get('/users', (req, res) => {
	const users = userService.getUsers()
	res.json(users)
})

app.listen(3000, () => {
	console.log('Server is running on http://localhost:3000')
})
  1. Executar o Servidor:
   npx ts-node src/index.ts

A API agora está rodando, e você pode usar o Postman para testar as rotas.


Padrões de Projeto Aconselháveis

  • Injeção de Dependências: Facilita a gestão de dependências e testes.
  • Repositórios: Encapsulam a lógica de acesso a dados.
  • Eventos de Domínio: Para comunicar mudanças e ações dentro do sistema.

Próximos Passos

  1. Explore como usar bancos de dados com TypeORM ou Mongoose.
  2. Aprenda sobre testes automatizados utilizando Jest.
  3. Estude mais sobre arquiteturas hexagonais e CQRS.

Possíveis Erros e Soluções

  • Erro ao iniciar o servidor: Certifique-se de que a porta não está em uso e que o código não possui erros de sintaxe.
  • Erro 500 – Internal Server Error: Verifique a lógica no seu serviço, assegurando que não há exceções não tratadas.


Prós e Contras do DDD

Prós

  • Foco no Domínio: Facilita a modelagem e entendimento do negócio.
  • Escalabilidade: Estruturas claras permitem crescimento sem grandes refatorações.
  • Manutenção: Códigos bem organizados facilitam a manutenção futura.

Contras

  • Curva de Aprendizado: Pode ser complicado para iniciantes.
  • Complexidade: Em pequenos projetos, pode introduzir complexidade desnecessária.

Performance das Ferramentas

  • Node.js: Ótima performance para operações I/O, ideal para aplicações em tempo real.
  • TypeScript: Adiciona tipagem estática, possibilitando encontrar erros em tempo de compilação.

Esse guia proporcionou uma introdução sólida à construção de uma API com Node.js e TypeScript, orientada pelo padrão DDD. Siga explorando e desenvolvendo suas habilidades para se tornar um desenvolvedor mais completo!