Publicado
- 3 min read
Construindo uma API com Node.js e TypeScript usando DDD e Arquitetura Hexagonal

Introdução
No cenário atual de desenvolvimento de software, criar APIs robustas e escaláveis é essencial para atender às demandas de negócios. Neste post, vamos explorar como construir uma API usando Node.js e TypeScript, utilizando o padrão de projeto Domain-Driven Design (DDD) e a Arquitetura Hexagonal. Esses conceitos não apenas organizam o código, mas também ajudam a manter uma separação clara de preocupações, tornando a manutenção e a evolução do sistema mais simples.
Pré-requisitos
Antes de começarmos, é importante que você tenha uma base nos seguintes tópicos:
- Familiaridade básica com JavaScript e TypeScript.
- Conhecimento prévio em Node.js.
- Noções sobre REST e como funcionam APIs.
Conceitos Principais
Domain-Driven Design (DDD)
O DDD é uma abordagem de desenvolvimento de software que destaca a importância do modelo de domínio. O modelo de domínio é a representação dos conceitos e regras de negócio de uma aplicação.
Exemplo básico de modelo de domínio
class User {
constructor(
public id: string,
public name: string
) {}
// Métodos relacionados ao usuário
}
Arquitetura Hexagonal
A Arquitetura Hexagonal, também conhecida como Ports and Adapters, sugere que o software não deve ser diretamente ligado a interfaces externas, como bancos de dados, serviços de terceiros, etc. Isso permite que a lógica de negócio permaneça independente das tecnologias específicas.
Estrutura Básica
Ao iniciar um projeto com DDD e Arquitetura Hexagonal, a estrutura do seu projeto pode se parecer com:
/src
/application
/domain
/infrastructure
/interface
- Application: Camada onde várias aplicações se comunicam e orquestram as regras de negócio.
- Domain: Contém as entidades e os serviços do domínio.
- Infrastructure: Implementações de interface com sistemas externos (banco de dados, APIs externas, etc.).
- Interface: Camada de apresentação, como controladores de rotas.
Mini-projeto Prático
Vamos criar uma simples API para gerenciar users
.
- Iniciar um projeto Node.js com TypeScript:
mkdir my-api && cd my-api
npm init -y
npm install typescript ts-node express @types/node @types/express
- Crie a estrutura de pastas conforme descrito acima.
- Adicione o modelo de domínio:
/src/domain/user.ts
export class User {
constructor(
public id: string,
public name: string
) {}
}
- Crie um controlador:
/src/interface/userController.ts
import express from 'express'
import { User } from '../domain/user'
const router = express.Router()
const users: User[] = []
router.post('/users', (req, res) => {
const { id, name } = req.body
const user = new User(id, name)
users.push(user)
res.status(201).json(user)
})
export default router
- Configurar o servidor:
/src/index.ts
import express from 'express'
import userController from './interface/userController'
const app = express()
app.use(express.json())
app.use('/api', userController)
app.listen(3000, () => {
console.log('Server is running on http://localhost:3000')
})
Padrões de Projeto Aconselháveis
- Injeção de Dependências: Facilita a troca de implementações.
- Repositórios: Para gerenciamento de dados, permitindo desacoplar a lógica de negócio do acesso a dados.
Dicas para Próximos Passos
- Aprenda mais sobre testes unitários e de integração.
- Explore frameworks como NestJS que implementam conceitos de DDD e Arquitetura Modular.
- Aprofunde-se em Design Patterns que podem ser aplicados na sua API.
Possíveis Erros e Como Solucionar
- Erro de Tipo no TypeScript: Certifique-se de que suas interfaces estão definidas corretamente e que o
tsconfig.json
está configurado. - CORS: Se você estiver testando a partir de um cliente diferente, pode enfrentar problemas de CORS. Considere usar o middleware
cors
.
Links para Materiais de Apoio
- Documentação do Node.js
- Documentação do TypeScript
- Domain-Driven Design - Eric Evans
- Arquitetura Hexagonal - Alistair Cockburn
Esperamos que este guia tenha sido útil e que agora você se sinta preparado para construir APIs usando Node.js e TypeScript de forma mais estruturada e eficiente!