Cookies com NodeJS

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! 😉

Criadores de Conteúdo

Foto do William Lima
William Lima
Fundador da Micilini

Inventor nato, escreve conteudos de programação para o portal da micilini.

Torne-se um MIC 🤖

Mais de 100 mic's já estão conectados na plataforma.