<h2>Introdução aos Módulos Nativos do Node.js</h2>
<p>O Node.js fornece diversos módulos nativos que permitem interagir com o sistema operacional sem depender de bibliotecas externas. Os quatro módulos que abordaremos — <strong>fs</strong>, <strong>path</strong>, <strong>os</strong> e <strong>crypto</strong> — são fundamentais para qualquer desenvolvedor JavaScript no backend. Eles cobrem manipulação de arquivos, caminhos de sistema, informações do SO e criptografia, respectivamente. Dominar esses módulos é essencial para construir aplicações robustas e seguras.</p>
<h2>Módulo fs: Operações com Arquivos</h2>
<p>O módulo <strong>fs</strong> (File System) permite ler, escrever e manipular arquivos no disco. Node.js oferece duas abordagens: <strong>síncrona</strong> (bloqueante) e <strong>assíncrona</strong> (não-bloqueante). Em produção, sempre use métodos assíncronos.</p>
<h3>Leitura e Escrita Básica</h3>
<pre><code class="language-javascript">const fs = require('fs');
// Escrita assíncrona
fs.writeFile('dados.txt', 'Olá, Node.js!', (err) => {
if (err) throw err;
console.log('Arquivo salvo!');
});
// Leitura assíncrona
fs.readFile('dados.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data); // Output: Olá, Node.js!
});</code></pre>
<h3>Usando Promises e Async/Await</h3>
<pre><code class="language-javascript">const fs = require('fs').promises;
async function gerenciarArquivos() {
try {
// Escrever
await fs.writeFile('config.json', JSON.stringify({ debug: true }));
// Ler
const conteudo = await fs.readFile('config.json', 'utf8');
console.log(JSON.parse(conteudo));
// Deletar
await fs.unlink('config.json');
} catch (err) {
console.error('Erro:', err.message);
}
}
gerenciarArquivos();</code></pre>
<p>A API Promises (<code>fs.promises</code>) é recomendada em código moderno, permitindo uso com <code>async/await</code> e tratamento de erros mais limpo.</p>
<h2>Módulo path: Manipulação de Caminhos</h2>
<p>O módulo <strong>path</strong> gerencia caminhos de arquivos de forma agnóstica ao sistema operacional. Ele resolve diferenças entre Windows (<code>\</code>) e Unix (<code>/</code>) automaticamente.</p>
<h3>Operações Comuns</h3>
<pre><code class="language-javascript">const path = require('path');
// Concatenar caminhos
const caminhoCompleto = path.join(__dirname, 'uploads', 'imagem.jpg');
console.log(caminhoCompleto);
// Windows: C:\projeto\uploads\imagem.jpg
// Unix: /home/usuario/projeto/uploads/imagem.jpg
// Extrair informações
const arquivo = '/home/usuario/dados.json';
console.log(path.dirname(arquivo)); // /home/usuario
console.log(path.basename(arquivo)); // dados.json
console.log(path.extname(arquivo)); // .json
// Resolver caminho absoluto
const relativo = './config/app.js';
console.log(path.resolve(relativo)); // /caminho/completo/config/app.js
// Separadores
console.log(path.sep); // \ (Windows) ou / (Unix)</code></pre>
<h3>Caso Prático: Validar Uploads</h3>
<pre><code class="language-javascript">const path = require('path');
const fs = require('fs').promises;
async function validarUpload(nomeArquivo) {
// Evitar traversal attacks
const uploadDir = path.join(__dirname, 'uploads');
const caminhoFinal = path.resolve(uploadDir, nomeArquivo);
// Verificar se o arquivo está dentro do diretório permitido
if (!caminhoFinal.startsWith(uploadDir)) {
throw new Error('Caminho inválido!');
}
return caminhoFinal;
}</code></pre>
<h2>Módulo os: Informações do Sistema Operacional</h2>
<p>O módulo <strong>os</strong> fornece informações sobre o hardware e o SO, sendo útil para decisões de configuração e monitoramento.</p>
<h3>Consultas de Sistema</h3>
<pre><code class="language-javascript">const os = require('os');
// Informações da plataforma
console.log(os.platform()); // 'linux', 'win32', 'darwin'
console.log(os.arch()); // 'x64', 'arm64'
// Recursos de hardware
console.log(os.cpus().length); // Número de núcleos
console.log(os.totalmem()); // Memória total em bytes
console.log(os.freemem()); // Memória livre em bytes
// Caminhos padrão
console.log(os.homedir()); // /home/usuario (Unix) ou C:\Users\usuario (Windows)
console.log(os.tmpdir()); // Diretório temporário do SO
// Uptime do sistema (em segundos)
console.log(os.uptime());</code></pre>
<h3>Exemplo Prático: Monitoramento de Memória</h3>
<pre><code class="language-javascript">const os = require('os');
function verificarMemoria() {
const totalMem = os.totalmem();
const freeMem = os.freemem();
const usedMem = totalMem - freeMem;
const percentualUso = (usedMem / totalMem * 100).toFixed(2);
console.log(Memória: ${percentualUso}% em uso);
if (percentualUso > 80) {
console.warn('⚠️ Alerta: Uso elevado de memória!');
}
}
// Verificar a cada 10 segundos
setInterval(verificarMemoria, 10000);</code></pre>
<h2>Módulo crypto: Criptografia e Hash</h2>
<p>O módulo <strong>crypto</strong> implementa operações criptográficas: hash, HMAC, criptografia simétrica e assimétrica. É essencial para segurança.</p>
<h3>Hash e HMAC</h3>
<pre><code class="language-javascript">const crypto = require('crypto');
// Gerar hash SHA256 de uma senha
const senha = 'minha_senha_secreta';
const hash = crypto.createHash('sha256').update(senha).digest('hex');
console.log(hash); // a7d8e8c...
// HMAC com chave secreta
const chave = 'chave_privada';
const hmac = crypto.createHmac('sha256', chave)
.update('mensagem')
.digest('hex');
console.log(hmac);
// Verificar senha (nunca compare strings diretas!)
const hashArmazenado = crypto
.createHash('sha256')
.update('minha_senha_secreta')
.digest('hex');
function verificarSenha(senhaDigitada, hashArmazenado) {
const hashDigitada = crypto
.createHash('sha256')
.update(senhaDigitada)
.digest('hex');
// Usar timingSafeEqual para evitar timing attacks
return crypto.timingSafeEqual(
Buffer.from(hashDigitada),
Buffer.from(hashArmazenado)
);
}</code></pre>
<h3>Criptografia Simétrica</h3>
<pre><code class="language-javascript">const crypto = require('crypto');
function criptografar(texto, chave) {
// A chave deve ter 32 bytes para AES-256
const iv = crypto.randomBytes(16);
const cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(chave), iv);
let encriptado = cipher.update(texto, 'utf8', 'hex');
encriptado += cipher.final('hex');
// Retornar IV + dados (necessário para descriptografar)
return iv.toString('hex') + ':' + encriptado;
}
function descriptografar(dados, chave) {
const [ivHex, encriptado] = dados.split(':');
const iv = Buffer.from(ivHex, 'hex');
const decipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(chave), iv);
let texto = decipher.update(encriptado, 'hex', 'utf8');
texto += decipher.final('utf8');
return texto;
}
// Uso
const chave = crypto.randomBytes(32);
const original = 'Dados sensíveis';
const criptografado = criptografar(original, chave);
const descriptografado = descriptografar(criptografado, chave);
console.log(descriptografado); // Dados sensíveis</code></pre>
<h2>Conclusão</h2>
<p>Os quatro módulos nativos abordados formam a base para desenvolvimento backend com Node.js. O <strong>fs</strong> permite gerenciar arquivos, o <strong>path</strong> resolve caminhos de forma segura e portável, o <strong>os</strong> oferece informações do sistema para decisões dinâmicas, e o <strong>crypto</strong> protege dados sensíveis através de hashing e criptografia. Domine essas APIs e você terá ferramentas poderosas para construir aplicações profissionais. Lembre-se: sempre use operações assíncronizadas em produção, valide caminhos para evitar traversal attacks e implemente criptografia adequada para dados sensíveis.</p>
<h2>Referências</h2>
<ul>
<li><a href="https://nodejs.org/api/fs.html" target="_blank" rel="noopener noreferrer">Node.js fs Documentation</a></li>
<li><a href="https://nodejs.org/api/path.html" target="_blank" rel="noopener noreferrer">Node.js path Documentation</a></li>
<li><a href="https://nodejs.org/api/os.html" target="_blank" rel="noopener noreferrer">Node.js os Documentation</a></li>
<li><a href="https://nodejs.org/api/crypto.html" target="_blank" rel="noopener noreferrer">Node.js crypto Documentation</a></li>
<li><a href="https://cheatsheetseries.owasp.org/cheatsheets/Cryptographic_Storage_Cheat_Sheet.html" target="_blank" rel="noopener noreferrer">OWASP: Cryptographic Storage Cheat Sheet</a></li>
</ul>