Cookies com NodeJS
Você sabe o que são Cookies da Web? 🙂
Te garanto que não são um daqueles biscoitos delíciosos recheados de chocolate que costumamos comprar por aí 🍪
O que são Cookies?
Cookies de internet são pequenos arquivos de texto que os sites enviam e armazenam no navegador de um usuário enquanto ele navega na web.
Tais cookies armazenam informações referentes às interações que o usuário realiza no site, como preferências, itens no carrinho de compras, histórico de navegação, ou dados de login.
São graças aos cookies, que nosso site é capaz de lembrar as interações que nossos usuários realizaram enquanto estiveram nele, o que proporciona uma experiência de navegação mais personalizada e eficiente.
Atualmente nós temos três tipos de Cookies:
Cookies de sessão: armazenam informações temporárias, e são excluídos assim que o usuário fecha o navegador.
Cookies persistentes: as informações permanecem armazenados no dispositivo do usuário por um período definido, mesmo após o navegador ser fechado.
Cookies de terceiros: criados por domínios externos ao site que o usuário está visitando, geralmente usados para rastreamento e publicidade.
Apesar dos cookies serem similares aos bancos de dados, ele são usados apenas para armazenar uma quantidade pequena de informações.
Criando e recuperando Cookies com NodeJS (módulo HTTP)
O processo de criação de cookies com NodeJS, costuma ser algo um tanto quanto complexo, isto é, caso você esteja usando o módulo HTTP 😭
const http = require('http');
// Função para analisar cookies recebidos
function parseCookies(request) {
const list = {};
const cookieHeader = request.headers.cookie;
if (cookieHeader) {
cookieHeader.split(';').forEach(cookie => {
let [name, ...rest] = cookie.split('=');
name = name?.trim();
const value = rest.join('=').trim();
if (name && value) {
list[name] = decodeURIComponent(value);
}
});
}
return list;
}
// Função para criar cookies no cabeçalho da resposta
function setCookie(name, value, options = {}) {
let cookie = `${name}=${encodeURIComponent(value)}`;
if (options.maxAge) {
cookie += `; Max-Age=${options.maxAge}`;
}
if (options.httpOnly) {
cookie += '; HttpOnly';
}
return cookie;
}
const server = http.createServer((req, res) => {
// Analisando cookies da requisição
const cookies = parseCookies(req);
if (req.url === '/set-cookie') {
// Definindo um cookie chamado 'meuCookie' com o valor 'valorDoCookie' que expira em 1 dia (86400 segundos)
res.setHeader('Set-Cookie', setCookie('meuCookie', 'valorDoCookie', { maxAge: 86400, httpOnly: true }));
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Cookie foi definido com sucesso!');
} else if (req.url === '/get-cookie') {
// Lendo o cookie 'meuCookie'
const meuCookie = cookies['meuCookie'];
if (meuCookie) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end(`O valor do cookie 'meuCookie' é: ${meuCookie}`);
} else {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Cookie não encontrado');
}
} else if (req.url === '/clear-cookie') {
// Removendo o cookie 'meuCookie' (setando com valor vazio e expiração passada)
res.setHeader('Set-Cookie', setCookie('meuCookie', '', { maxAge: -1 }));
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Cookie foi removido com sucesso!');
} else {
res.writeHead(404, { 'Content-Type': 'text/plain' });
res.end('Página não encontrada');
}
});
// Inicia o servidor na porta 3000
server.listen(3000, () => {
console.log('Servidor rodando na porta 3000');
});
Para criar e selecionar nossos cookies, inevitavelmente você precisa de uma biblioteca (ou módulo) capaz de subir um servidor em NodeJS (fazer requisições HTTP).
No código acima, nós estamos criando um servidor usando o módulo HTTP, onde passamos a variável req
(que contém todas as informações da requisição, incluíndo nossos cookies) para a função responsável por tratá-los (parseCookies).
Já a variével res
conta com funcionalidades capazes de setar um cookie
, tanto que estamos fazendo isso com a ajuda função setCookie
.
Apesar da lógica de criação e recuperação de cookies com o módulo HTTP parecer ser um tanto quanto complexa, as coisas costumam melhorar significativamente quando trabalhamos com o express 😅
Criando e recuperando cookies com NodeJS (biblioteca Express)
Como vimos em lições anteriores, com a biblioteca do Express, o processo de criação de um servidor se torna mais simples e rápido, e criar/recuperar cookies
com ele, não é muito diferente 😋
No caso do express
, nós podemos fazer o uso de outra biblioteca chamada de cookie-parser que pode ser instalada no seu projeto para lidar com suas implementações de cookies:
npm install cookie-parser
Para testarmos isso, vamos criar um servidor com 3 rotas diferentes:
- /set-cookie
- /get-cookie
- /clear-cookie
const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();
const port = 3000;
// Middleware para interpretar cookies
app.use(cookieParser());
// Rota para definir um cookie
app.get('/set-cookie', (req, res) => {
// Define um cookie chamado 'meuCookie' com o valor 'valorDoCookie' que expira em 1 dia
res.cookie('meuCookie', 'valorDoCookie', { maxAge: 24 * 60 * 60 * 1000, httpOnly: true });
res.send('Cookie foi definido com sucesso!');
});
// Rota para ler o cookie
app.get('/get-cookie', (req, res) => {
// Lê o cookie 'meuCookie' do cliente
const meuCookie = req.cookies.meuCookie;
if (meuCookie) {
res.send(`O valor do cookie 'meuCookie' é: ${meuCookie}`);
} else {
res.send('Cookie não encontrado');
}
});
// Rota para remover o cookie
app.get('/clear-cookie', (req, res) => {
// Remove o cookie 'meuCookie'
res.clearCookie('meuCookie');
res.send('Cookie foi removido com sucesso!');
});
app.listen(port, () => {
console.log(`Servidor rodando na porta ${port}`);
});
Note que em cada uma delas, estamos fazendo o uso das variáveis req
e res
, para criarmos e recuperarmos nossos cookies
.
Simplificou agora, não? 😍
Arquivos da lição
Os arquivos que você viu durante o decorrer desta lição, podem ser encontrados neste link.
Conclusão
Nesta lição, você aprendeu a gerenciar seus cookies usando o módulo HTTP e a biblioteca do Express.
Até a próxima! 😉