A seguir, você encontrará um tutorial completo sobre como implementar requisições assíncronas utilizando controllers em uma aplicação Node.js com Express. Esse método é muito utilizado para organizar a lógica de negócios e interagir com bancos de dados ou APIs externas sem bloquear a execução do servidor.


1. Introdução

Em aplicações web modernas, é comum que operações de E/S – como consultas a banco de dados, chamadas a APIs ou leitura de arquivos – sejam realizadas de forma assíncrona. Utilizar async/await dentro dos controllers torna o código mais limpo, legível e facilita o tratamento de erros. Esse tutorial abordará:


2. Estrutura do Projeto

Uma organização comum para um projeto que utiliza controllers assíncronos pode ser a seguinte:

.
├── config/
│   └── db.js
├── controllers/
│   └── usuarioController.js
├── models/
│   └── usuarioModel.js
├── routes/
│   └── usuarioRoutes.js
├── views/
│   └── index.ejs
├── public/
│   └── css/
│       └── styles.css
├── .env
├── .gitignore
└── server.js

3. Exemplo de Código

3.1. Modelo Assíncrono (usuarioModel.js)

Aqui, simulamos uma consulta ao "banco de dados" utilizando uma Promise que resolve após 1 segundo.

// models/usuarioModel.js
const usuarios = [
  { id: 1, nome: 'João' },
  { id: 2, nome: 'Maria' }
];

function findAll() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(usuarios);
    }, 1000); // Simula uma operação assíncrona (ex.: consulta ao banco)
  });
}

module.exports = { findAll };