Gerar CPF em Node.js e Express: Módulo e API REST
Este módulo Node.js implementa no servidor a mesma lógica de gerar CPF válido online do navegador, aplicando o algoritmo de módulo 11 para produzir números sob demanda. Exporta funções reutilizáveis para geração e validação, com API Express e CLI prontas para uso.
Módulo
// cpf.js
function generateCPF() {
const digits = [];
for (let i = 0; i < 9; i++) {
digits.push(Math.floor(Math.random() * 10));
}
let sum1 = 0;
for (let i = 0; i < 9; i++) {
sum1 += digits[i] * (10 - i);
}
const r1 = sum1 % 11;
const d1 = r1 < 2 ? 0 : 11 - r1;
digits.push(d1);
let sum2 = 0;
for (let i = 0; i < 10; i++) {
sum2 += digits[i] * (11 - i);
}
const r2 = sum2 % 11;
const d2 = r2 < 2 ? 0 : 11 - r2;
digits.push(d2);
return digits.join("");
}
function validateCPF(value) {
const cpf = String(value).replace(/\D/g, "");
if (cpf.length !== 11) return false;
if (/^(\d)\1{10}$/.test(cpf)) return false;
for (let t = 9; t < 11; t++) {
let sum = 0;
for (let c = 0; c < t; c++) {
sum += Number(cpf[c]) * (t + 1 - c);
}
const digit = ((10 * sum) % 11) % 10;
if (Number(cpf[t]) !== digit) return false;
}
return true;
}
module.exports = { generateCPF, validateCPF };Para projetos ESM, substitua a última linha por:
export { generateCPF, validateCPF };API Express
// server.js
const express = require("express");
const { generateCPF, validateCPF } = require("./cpf");
const app = express();
const PORT = process.env.PORT || 3000;
app.get("/api/cpf/generate", (req, res) => {
const count = Math.min(Math.max(parseInt(req.query.count, 10) || 1, 1), 100);
const cpfs = [];
for (let i = 0; i < count; i++) {
cpfs.push(generateCPF());
}
if (count === 1) {
return res.json({ cpf: cpfs[0] });
}
res.json({ cpfs, count });
});
app.listen(PORT, () => {
console.log(`Servidor rodando na porta ${PORT}`);
});Exemplos de requisição:
GET /api/cpf/generate— retorna{ "cpf": "52998224725" }GET /api/cpf/generate?count=10— retorna{ "cpfs": [...], "count": 10 }
O parâmetro count aceita valores de 1 a 100.
CLI
#!/usr/bin/env node
// generate-cpf.js
const { generateCPF } = require("./cpf");
const count = Math.max(parseInt(process.argv[2], 10) || 1, 1);
for (let i = 0; i < count; i++) {
console.log(generateCPF());
}Uso no terminal:
node generate-cpf.js # gera 1 CPF
node generate-cpf.js 10 # gera 10 CPFs, um por linhaAnalise do codigo
O módulo cpf.js exporta duas funções puras sem dependências externas. generateCPF cria 9 dígitos aleatórios com Math.random(), calcula o primeiro verificador multiplicando cada dígito pelo peso decrescente (10 a 2) e aplicando % 11, depois repete com 10 dígitos e pesos de 11 a 2 para o segundo verificador. validateCPF está incluída no mesmo módulo para que consumidores possam confirmar a validade dos CPFs gerados.
A API Express expõe um único endpoint GET /api/cpf/generate que aceita o query parameter count para geração em lote. O valor é limitado entre 1 e 100 para evitar abuso. Quando count é 1 (ou omitido), retorna um objeto simples com o campo cpf; para múltiplos, retorna um array cpfs junto com a contagem.
O script CLI lê a quantidade desejada de process.argv[2], com padrão de 1. Imprime cada CPF em uma linha separada, facilitando o redirecionamento para arquivo (node generate-cpf.js 100 > cpfs.txt) ou uso em pipelines de shell.
Testes
import { describe, it, expect } from "vitest";
import request from "supertest";
describe("generateCPF", () => {
it("retorna string com 11 dígitos numéricos", () => {
const cpf = generateCPF();
expect(cpf).toMatch(/^\d{11}$/);
});
it("gera CPF que passa na validação", () => {
const cpf = generateCPF();
expect(validateCPF(cpf)).toBe(true);
});
it("gera CPFs diferentes entre si", () => {
const cpfs = new Set();
for (let i = 0; i < 50; i++) {
cpfs.add(generateCPF());
}
expect(cpfs.size).toBeGreaterThan(1);
});
});
describe("GET /api/cpf/generate", () => {
it("retorna JSON com CPF válido", async () => {
const res = await request(app).get("/api/cpf/generate");
expect(res.status).toBe(200);
expect(res.body.cpf).toMatch(/^\d{11}$/);
expect(validateCPF(res.body.cpf)).toBe(true);
});
it("retorna múltiplos CPFs com count", async () => {
const res = await request(app).get("/api/cpf/generate?count=5");
expect(res.status).toBe(200);
expect(res.body.cpfs).toHaveLength(5);
expect(res.body.count).toBe(5);
res.body.cpfs.forEach((cpf) => {
expect(validateCPF(cpf)).toBe(true);
});
});
});Veja também: validar CPF em Node.js e o gerador de CPF online.