Logo

Publicado

- 3 min read

Construindo uma API com Node.js e TypeScript usando DDD e Arquitetura Hexagonal

img of 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.

  1. 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
  1. Crie a estrutura de pastas conforme descrito acima.
  2. Adicione o modelo de domínio:
    • /src/domain/user.ts
   export class User {
	constructor(
		public id: string,
		public name: string
	) {}
}
  1. 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
  1. 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.

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!