Promises, Async/Await, Módulos Nativos do Node.js e Express.js
🎯 Objetivo: Dominar programação assíncrona, explorar módulos nativos do Node.js e criar seu primeiro servidor Express
0% concluído
JavaScript Assíncrono: Promises e Async/Await
Vamos aprofundar o conhecimento em Promises e aprender métodos avançados como Promise.all() e Promise.race()!
// 1. Promise.all() - Executa múltiplas promises em paralelo
function buscarUsuario(id) {
return new Promise((resolve) => {
setTimeout(() => {
resolve({ id, nome: `Usuário ${id}`, email: `user${id}@email.com` });
}, Math.random() * 1000 + 500);
});
}
function buscarPosts(userId) {
return new Promise((resolve) => {
setTimeout(() => {
resolve([
{ id: 1, titulo: 'Post 1', userId },
{ id: 2, titulo: 'Post 2', userId }
]);
}, Math.random() * 1000 + 300);
});
}
function buscarComentarios(postId) {
return new Promise((resolve) => {
setTimeout(() => {
resolve([
{ id: 1, texto: 'Ótimo post!', postId },
{ id: 2, texto: 'Muito útil!', postId }
]);
}, Math.random() * 800 + 200);
});
}
console.log('=== DEMONSTRAÇÃO DE PROMISE.ALL ===');
// Executando múltiplas operações em paralelo
const promises = [
buscarUsuario(1),
buscarUsuario(2),
buscarUsuario(3)
];
Promise.all(promises)
.then(usuarios => {
console.log('✅ Todos os usuários carregados:');
usuarios.forEach(user => {
console.log(` - ${user.nome} (${user.email})`);
});
// Agora buscar posts de todos os usuários
const postPromises = usuarios.map(user => buscarPosts(user.id));
return Promise.all(postPromises);
})
.then(todosOsPosts => {
console.log('📝 Posts de todos os usuários:');
todosOsPosts.forEach((posts, index) => {
console.log(` Usuário ${index + 1}: ${posts.length} posts`);
});
})
.catch(erro => {
console.error('❌ Erro:', erro.message);
});
console.log('⏳ Carregando dados em paralelo...');
Promise.all()
Executa todas em paralelo, falha se uma falhar
Promise.allSettled()
Aguarda todas, independente de falhas
Promise.race()
Retorna a primeira que resolver
Promise.any()
Retorna a primeira que resolver com sucesso
Async/await torna o código assíncrono mais limpo e fácil de ler, como se fosse código síncrono!
// Simulação de API externa
function simularAPIExterna(endpoint) {
return new Promise((resolve, reject) => {
const tempo = Math.random() * 2000 + 500;
setTimeout(() => {
if (Math.random() > 0.2) { // 80% de sucesso
const dados = {
'/usuarios': [{ id: 1, nome: 'Ana' }, { id: 2, nome: 'João' }],
'/posts': [{ id: 1, titulo: 'Post 1' }, { id: 2, titulo: 'Post 2' }],
'/comentarios': [{ id: 1, texto: 'Ótimo!' }]
};
resolve(dados[endpoint] || { message: 'Dados encontrados' });
} else {
reject(new Error(`Erro na API: ${endpoint}`));
}
}, tempo);
});
}
// Função usando async/await
async function carregarDadosCompletos() {
try {
console.log('🔄 Iniciando carregamento de dados...');
// Carregamento sequencial
console.log('👥 Buscando usuários...');
const usuarios = await simularAPIExterna('/usuarios');
console.log('✅ Usuários carregados:', usuarios.length, 'encontrados');
console.log('📝 Buscando posts...');
const posts = await simularAPIExterna('/posts');
console.log('✅ Posts carregados:', posts.length, 'encontrados');
console.log('💬 Buscando comentários...');
const comentarios = await simularAPIExterna('/comentarios');
console.log('✅ Comentários carregados:', comentarios.length, 'encontrados');
// Processamento dos dados
const resultado = {
totalUsuarios: usuarios.length,
totalPosts: posts.length,
totalComentarios: comentarios.length,
carregadoEm: new Date().toLocaleTimeString()
};
console.log('🎯 Carregamento completo!');
console.log('📊 Resumo:', resultado);
return resultado;
} catch (error) {
console.error('❌ Erro durante carregamento:', error.message);
throw error;
}
}
// Função usando async/await com Promise.all (paralelo)
async function carregarDadosParalelo() {
try {
console.log('\n🚀 Carregamento em paralelo...');
const [usuarios, posts, comentarios] = await Promise.all([
simularAPIExterna('/usuarios'),
simularAPIExterna('/posts'),
simularAPIExterna('/comentarios')
]);
console.log('⚡ Todos os dados carregados simultaneamente!');
console.log('📊 Resultado:', {
usuarios: usuarios.length,
posts: posts.length,
comentarios: comentarios.length
});
} catch (error) {
console.error('❌ Erro no carregamento paralelo:', error.message);
}
}
// Executando os exemplos
console.log('=== DEMONSTRAÇÃO ASYNC/AWAIT ===');
carregarDadosCompletos();
setTimeout(() => {
carregarDadosParalelo();
}, 3000);
Crie um sistema que simula downloads de arquivos usando async/await e Promise.all()!
Introdução ao Express.js - Framework Web
Express.js é o framework web mais popular para Node.js. Ele simplifica a criação de servidores e APIs!
// Simulação do Express.js
// (Em Node.js real: const express = require('express'))
// 1. Simulando o Express
function criarExpress() {
const rotas = [];
const middlewares = [];
const app = {
// Método GET
get: (caminho, handler) => {
rotas.push({ metodo: 'GET', caminho, handler });
console.log(`📍 Rota GET ${caminho} registrada`);
},
// Método POST
post: (caminho, handler) => {
rotas.push({ metodo: 'POST', caminho, handler });
console.log(`📍 Rota POST ${caminho} registrada`);
},
// Middleware
use: (middleware) => {
middlewares.push(middleware);
console.log(`🔧 Middleware registrado`);
},
// Iniciar servidor
listen: (porta, callback) => {
console.log(`🚀 Servidor Express rodando na porta ${porta}`);
if (callback) callback();
return {
rotas,
middlewares,
porta
};
},
// Simular requisição
simularRequisicao: (metodo, caminho, dados = {}) => {
console.log(`\n📥 ${metodo} ${caminho}`);
// Executar middlewares
middlewares.forEach(middleware => {
console.log('🔧 Executando middleware...');
middleware({ metodo, caminho, dados }, { status: 200 }, () => {});
});
// Encontrar rota
const rota = rotas.find(r => r.metodo === metodo && r.caminho === caminho);
if (rota) {
const req = { metodo, caminho, dados, params: {}, query: {} };
const res = {
status: (code) => {
console.log(`📤 Status: ${code}`);
return res;
},
json: (data) => {
console.log('📄 Resposta JSON:', JSON.stringify(data, null, 2));
return res;
},
send: (data) => {
console.log('📄 Resposta:', data);
return res;
}
};
rota.handler(req, res);
} else {
console.log('❌ 404 - Rota não encontrada');
}
}
};
return app;
}
// 2. Criando aplicação Express
console.log('=== DEMONSTRAÇÃO DO EXPRESS.JS ===');
const express = criarExpress;
const app = express();
// 3. Middleware de log
app.use((req, res, next) => {
const timestamp = new Date().toLocaleTimeString();
console.log(`[${timestamp}] ${req.metodo} ${req.caminho}`);
next();
});
// 4. Rotas básicas
app.get('/', (req, res) => {
res.status(200).send('Bem-vindo ao Express!');
});
app.get('/usuarios', (req, res) => {
const usuarios = [
{ id: 1, nome: 'Ana', email: 'ana@email.com' },
{ id: 2, nome: 'João', email: 'joao@email.com' }
];
res.status(200).json(usuarios);
});
app.post('/usuarios', (req, res) => {
const novoUsuario = {
id: Date.now(),
nome: req.dados.nome || 'Usuário',
email: req.dados.email || 'email@exemplo.com'
};
res.status(201).json({
mensagem: 'Usuário criado com sucesso!',
usuario: novoUsuario
});
});
app.get('/sobre', (req, res) => {
res.status(200).json({
aplicacao: 'Minha API Express',
versao: '1.0.0',
autor: 'Desenvolvedor Backend'
});
});
// 5. Iniciar servidor
const servidor = app.listen(3000, () => {
console.log('✅ Servidor Express iniciado com sucesso!');
});
// 6. Simular algumas requisições
console.log('\n🧪 Testando rotas:');
setTimeout(() => {
app.simularRequisicao('GET', '/');
app.simularRequisicao('GET', '/usuarios');
app.simularRequisicao('POST', '/usuarios', { nome: 'Maria', email: 'maria@email.com' });
app.simularRequisicao('GET', '/sobre');
app.simularRequisicao('GET', '/inexistente');
}, 1000);
Rotas
app.get(), app.post(), app.put(), app.delete()
Middleware
Funções que executam entre req e res
Request (req)
Dados da requisição (params, query, body)
Response (res)
Enviar resposta (json, send, status)
Crie uma API completa para gerenciar livros usando Express.js com todas as operações CRUD!
Teste todos os conceitos aprendidos em tempo real!
Dominou Promises, async/await e Promise.all()
Aprendeu fs, path e manipulação de arquivos
Criou seu primeiro servidor web com framework
🚀 Próxima semana: APIs REST, Middleware e Estrutura de Projetos!