Ramos da InformáticaMundoJSGuia de Boas Práticas no Node.js: Escreva Código Profissional

Guia de Boas Práticas no Node.js: Escreva Código Profissional

-

Ramos da Informática
JS TS IA

Pesquisa: Como você está usando IA na sua rotina Dev?

Responda em menos de 2 minutos e ajude a direcionar nossos próximos artigos técnicos, guias e conteúdos.

Responder Pesquisa →

Quer elevar o nível do seu código? Aprenda as melhores práticas de Node.js: tratamento de erros moderno, async/await, frameworks de testes (Jest/Mocha) e ESLint.

Este tutorial tem como objetivo mostrar com exemplos práticos as boas práticas de desenvolvimento com NodeJS.

Algumas boas práticas no desenvolvimento NodeJS incluem:

  1. Utilização de módulos e padrões de arquitetura para modularizar o código.
  2. Gerenciamento de erros de forma clara e objetiva.
  3. Uso de promises ou async/await para lidar com requisições assíncronas.
  4. Utilização de frameworks de testes, como Mocha, Cypress ou Jest, para realizar testes unitários e integração.
  5. Utilização de ferramentas de gerenciamento de pacotes, como npm ou yarn, para gerenciar dependências.
  6. Adoção de uma boa estratégia de versionamento.
  7. Documentação clara e objetiva do código.
  8. Utilização de linting e análise de código estático para garantir a qualidade e padronização do código.

 

Dica de Leitura: Se você está procurando por boas práticas de desenvolvimento NodeJS, também é importante considerar a qualidade do código e como testá-lo de forma eficaz. Para isso, é fundamental ter uma ferramenta de análise de código confiável. Saiba como instalar e configurar o SonarQube para seus projetos Node.js e melhore a qualidade do seu código.

Utilização de módulos e padrões de arquitetura para modularizar o código.

A utilização de módulos é uma boa prática no desenvolvimento NodeJS pois permite que o código seja modularizado e reaproveitado em diferentes partes da aplicação. É possível usar módulos nativos do NodeJS ou módulos instalados via npm.

Por exemplo, o módulo fs (File System) pode ser usado para acessar arquivos do sistema operacional, e o módulo express é muito utilizado para criar aplicações web.

A seguir um exemplo de como importar e utilizar o módulo fs:

javascript

const fs = require('fs');

 

fs.readFile('arquivo.txt', 'utf-8', (err, data) => {
if (err) throw err;
console.log(data);
});

 

Já a utilização de padrões de arquitetura, como MVC (Model-View-Controller), ajuda a manter o código organizado e fácil de manter. Aqui está um exemplo de como o padrão MVC pode ser implementado em uma aplicação NodeJS:

// controllers/usuario.js
const Usuario = require('../models/usuario');

exports.criarUsuario = (req, res) => {
  const novoUsuario = new Usuario(req.body);
  novoUsuario.save((err) => {
    if (err) res.send(err);
    res.json({ mensagem: 'Usuário criado com sucesso!' });
  });
};

// models/usuario.js
const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const UsuarioSchema = new Schema({
  nome: String,
  email: String,
  senha: String
});

module.exports = mongoose.model('Usuario', UsuarioSchema);

Gerenciamento de erros de forma clara e objetiva.

Gerenciamento de erros é importante em qualquer aplicação para garantir a integridade e a confiabilidade dos dados. No NodeJS, você pode gerenciar erros de forma clara e objetiva utilizando try-catch blocks. Veja um exemplo:

try {
  // código que pode gerar erro
  const result = someFunctionThatMayThrowError();
  console.log(result);
} catch (error) {
  console.error(error);
}
Neste exemplo, o bloco try contém o código que pode gerar um erro, enquanto o bloco catch irá capturar qualquer erro gerado. Isso permite que você trate os erros de forma mais clara, como por exemplo imprimindo o erro no console ou registrando o erro em um log.

Além disso, é importante utilizar a função de callback de forma correta e tratar seus erros com tratamento de erro adequado, como por exemplo:

fs.readFile('some-file.txt', (err, data) => {
  if (err) {
    console.error(err);
  } else {
    console.log(data);
  }
});

Neste exemplo, a função readFile é passada como um callback que será chamada quando o arquivo for lido. Se houver um erro ao ler o arquivo, a função de callback irá receber um objeto de erro como primeiro argumento. Se não houver erro, a função de callback irá receber o conteúdo do arquivo como segundo argumento.

Uso de promises ou async/await para lidar com requisições assíncronas

No NodeJS, as promises e o async/await são usados para lidar com requisições assíncronas, evitando o callback hell.

Exemplo usando Promise:

const fs = require('fs');

const readFile = file => {
  return new Promise((resolve, reject) => {
    fs.readFile(file, 'utf-8', (err, data) => {
      if (err) return reject(err);
      return resolve(data);
    });
  });
};

readFile('file.txt')
  .then(data => {
    console.log(data);
  })
  .catch(err => {
    console.error(err);
  }); Exemplo usando async/await:
const fs = require('fs');
const util = require('util');

const readFile = util.promisify(fs.readFile);

async function readData() {
  try {
    const data = await readFile('file.txt', 'utf-8');
    console.log(data);
  } catch (err) {
    console.error(err);
  }
}

readData();

Nestes exemplos, a Promise readFile é criada e retorna um arquivo file.txt lido. A função then é usada para lidar com o resultado bem-sucedido da Promise, e a função catch é usada para lidar com erros. Já o exemplo usando async/await usa a função readData que é marcada como async, permitindo o uso de await para esperar a Promise readFile ser resolvida antes de ler o arquivo.

Utilização de frameworks de testes, como Mocha, Cypress ou Jest, para realizar testes unitários e integração.

A utilização de frameworks de testes é uma boa prática para garantir a qualidade do código e evitar erros futuros. Alguns dos frameworks mais populares para testes no Node.js incluem Mocha, Cypress e Jest. Vamos dar uma olhada em exemplos práticos de como cada um pode ser usado:

Mocha: É um framework simples e versátil para testes unitários. Aqui está um exemplo de como testar uma função soma em Mocha:

const assert = require("assert");

function sum(a, b) {
  return a + b;
}

describe("sum", () => {
  it("should return the sum of two numbers", () => {
    assert.equal(sum(1, 2), 3);
  });
});

Cypress: É uma ferramenta de teste end-to-end que permite automatizar testes do usuário final. Aqui está um exemplo de como testar uma interação do usuário com um botão em Cypress:

describe("Button interaction", () => {
  it("should display a message when clicked", () => {
    cy.visit("https://example.com");
    cy.get("button").click();
    cy.get("#message").should("contain", "Button was clicked");
  });
});

Jest: É um framework completo para testes unitários e integração que inclui recursos como snapshots e mocks. Aqui está um exemplo de como testar uma função de soma com Jest:

function sum(a, b) {
  return a + b;
}

test("sum adds numbers", () => {
  expect(sum(1, 2)).toBe(3);
});

Estes são apenas alguns exemplos de como utilizar frameworks de testes no Node.js para garantir a qualidade do código. É importante escolher o framework que se adequa melhor às suas necessidades e implementá-lo de forma eficiente para garantir testes robustos e confiáveis.

english-interview-debugger.sh
$ grep -r "senior_dev_communication" ./career
[CRITICAL_ERROR] Código sênior detectado, mas fluência falhou no runtime.
Motivo: Travou na hora de explicar a arquitetura (System Design) em inglês para o gringo.

O mercado internacional não quer um robô de gramática. Quer um dev que saiba defender uma tomada de decisão técnica sob pressão. Destrave sua conversão na Preply com aulas particulares focadas em TI.

$ ./fix-english.sh --target=remote-job
Achar Professor Particular ➔

Utilização de ferramentas de gerenciamento de pacotes, como npm ou yarn, para gerenciar dependências.

O npm (Node Package Manager) e o yarn são as principais ferramentas de gerenciamento de pacotes utilizadas no desenvolvimento Node.js.

Exemplo de instalação de dependências usando npm:

// instalar uma dependência
npm install express

// instalar uma dependência de forma global
npm install -g nodemon

// instalar todas as dependências do seu projeto a partir do arquivo package.json
npm install

Exemplo de instalação de dependências usando yarn:

// instalar uma dependência
yarn add express

// instalar uma dependência de forma global
yarn global add nodemon

// instalar todas as dependências do seu projeto a partir do arquivo package.json
yarn

Ambos permitem a instalação, atualização e remoção de dependências, além de permitir a criação de scripts para automatizar tarefas comuns. O yarn é considerado mais rápido que o npm, mas ambos funcionam de forma semelhante e escolher um ou outro é uma questão de preferência pessoal.

Adoção de uma boa estratégia de versionamento.

A estratégia de versionamento é importante para garantir a manutenibilidade e rastreabilidade do código em projetos de software. Uma boa estratégia de versionamento pode incluir as seguintes ações:

  1. Utilização do sistema semântico de versionamento: Isso significa usar uma estrutura de versão como X.Y.Z, onde X é a versão maior, Y é a versão menor e Z é a correção de bugs.
  2. Criação de branches: Utilize branches separadas para desenvolvimento, correção de bugs e produção, para evitar conflitos de código.
  3. Tag de versão: Adicione tags para cada versão publicada, para facilitar o acesso às versões antigas.
  4. Commits bem escritos: Escreva commits claros e objetivos, para que outros desenvolvedores possam entender o que foi alterado.
  5. Utilização de Pull Requests: Utilize Pull Requests para revisar e aprovar mudanças no código antes de serem mescladas ao branch principal.

Exemplo de uso de uma boa estratégia de versionamento com Git e Github:

  1. Inicialize um repositório Git no seu projeto:
$ git init
  1. Adicione arquivos ao repositório:
$ git add .
  1. Realize um commit inicial:
$ git commit -m "Initial commit"
  1. Crie uma branch para o desenvolvimento:
$ git checkout -b develop
  1. Adicione e commite as mudanças realizadas na branch de desenvolvimento:
$ git add .
$ git commit -m "Adicionando novas funcionalidades"
  1. Crie uma tag de versão:
$ git tag -a v1.0.0 -m "Versão 1.0.0 lançada"
  1. Envie as mudanças para o repositório remoto no Github:
$ git push origin develop
$ git push origin v1.0.0

Com esta estratégia, é possível garantir uma boa gestão de versões no seu projeto Node.js, tornando mais fácil o gerenciamento de bugs, o acesso a versões antigas e a revisão de mudanças no código.

Documentação clara e objetiva do código.

A documentação do código é importante para ajudar outros desenvolvedores a entender e colaborar com o código. Aqui estão algumas boas práticas para documentar o código em Node.js:

  1. Documentação de cabeçalho: Adicione comentários claros e concisos no topo de cada arquivo de código para descrever o propósito geral do arquivo.
  2. Comentários de função: Adicione comentários claros e concisos antes de cada função para descrever o propósito da função, seus argumentos e o que ela retorna.
  3. Documentação de código JSDoc: Use a notação JSDoc para adicionar documentação mais detalhada ao código, incluindo tipos de argumentos, tipos de retorno, etc.

Exemplo de documentação de cabeçalho:

/**
* File: database.js
* Purpose: Arquivo de conexão com o banco de dados
*/

Exemplo de documentação de função:

/**
* getData
* @param {string} table - Nome da tabela
* @param {string} id - Id do registro
* @returns {Object} - Objeto de dados do registro
*/
function getData(table, id) {
// código da função
}

Exemplo de documentação JSDoc:

/**
 * @typedef {Object} User
 * @property {string} name - Nome do usuário.
 * @property {string} email - Email do usuário.
 */

/**
 * getUser
 * @param {string} id - Id do usuário
 * @returns {User} - Dados do usuário
 */
function getUser(id) {
  // código da função
}

Utilização de linting e análise de código estático para garantir a qualidade e padronização do código.

A utilização de linting e análise de código estático é uma boa prática para garantir a qualidade e padronização do código em Node.js. Isso pode ser feito usando ferramentas como ESLint, JSHint ou StandardJS.

Exemplo de uso do ESLint:

  1. Instale o ESLint usando o npm ou o yarn:
    npm install eslint --save-dev

Inicialize o ESLint com as configurações padrão:

npx eslint --init
  1. Edite o arquivo .eslintrc com as regras personalizadas.
  2. Adicione a seguinte linha no package.json:
"lint": "eslint ."
  1. xecute o lint com o seguinte comando:
npm run lint

Agora, ao executar o comando acima, o ESLint irá verificar todo o seu código e informar sobre qualquer erro ou aviso encontrado, seguindo as regras definidas no arquivo .eslintrc. Dessa forma, é possível garantir que o código esteja de acordo com as boas práticas e padrões definidos.

Conclusão

Seguindo este padrão de boas práticas no desenvolvimento de aplicações NodeJS você alcançará qualidade de código e melhor engajamento com a equipe de desenvolvedores dos projetos onde trabalhará.

LEIA TAMBÉM:

Perguntas Frequentes (FAQ): Boas Práticas Node.js

Por que usar async/await em vez de Callbacks?

O uso de async/await torna o código assíncrono muito mais legível e fácil de manter, pois ele “parece” um código síncrono tradicional. Isso evita o famoso Callback Hell (aninhamento excessivo de funções) e facilita o tratamento de erros usando blocos try/catch padrão.

Qual é o melhor framework de testes para Node.js hoje?

Atualmente, o Jest é o padrão da indústria por ser uma ferramenta “tudo-em-um” (inclui runner, assertion e mocks). No entanto, o Mocha continua muito popular por sua flexibilidade, e para testes End-to-End (E2E), o Cypress e o Playwright dominam o mercado.

O que é JSDoc e por que eu deveria usá-lo?

JSDoc é uma linguagem de marcação usada para anotar arquivos de código-fonte JavaScript. Ao usá-lo, você fornece informações sobre tipos de dados e propósitos de funções que as IDEs (como o VS Code) usam para oferecer auto-completar inteligente, além de permitir a geração automática de documentação técnica para o seu projeto.

Como o ESLint ajuda na qualidade do código?

O ESLint é um “linter” que analisa seu código estaticamente em busca de padrões problemáticos ou que não aderem ao guia de estilo da equipe (como variáveis não utilizadas ou falta de ponto e vírgula). Ele garante que todo o time de desenvolvedores escreva código com a mesma “cara”, reduzindo bugs e facilitando o Code Review.

Ramos da Informática
JS TS IA

Pesquisa: Como você está usando IA na sua rotina Dev?

Responda em menos de 2 minutos e ajude a direcionar nossos próximos artigos técnicos, guias e conteúdos.

Responder Pesquisa →
Ramos da Informática
Ramos da Informáticahttps://ramosdainformatica.com.br
Ramos da Informática é um hub de comunidade dedicado a linguagens de programação, banco de dados, DevOps, Internet das Coisas (IoT), tecnologias da Indústria 4.0, cibersegurança e startups. Com curadoria de conteúdos de qualidade, o projeto é mantido por Ramos de Souza Janones.

Mais recentes

NVIDIA Lança Cosmos 3: Nova Plataforma de IA Física para Robôs Humanoides e Fábricas Inteligentes

NVIDIA apresenta plataforma full-stack para robôs humanoides, robotáxis e fábricas inteligentes Cosmos 3, robôs humanoides e ferramentas para robotáxis são...

Repositórios e Skills Essenciais para Claude Code, Cursor e Codex

Se você já integrou o Claude Code, Cursor ou Codex no seu fluxo de trabalho, sabe que o jogo...

17 Ferramentas No-Code para Validar Seu Negócio

No mundo dos negócios, construir um Produto Mínimo Viável (MVP) não pode ser sinônimo de queimar o caixa da...

Extensões PostgreSQL: Substitua Redis, MongoDB e Kafka com SQL

Dominar as extensões PostgreSQL deixou de ser apenas uma opção para se tornar a principal estratégia de arquitetura em...
E-Zine Dev

Evolua para Sênior

Estratégias de Node.js, arquitetura Limpa e IA que nunca publicamos no blog. Junte-se a +10.000 devs.

Assinar Gratuitamente Zero spam. Cancele quando quiser.

State of AI 2026: A Maturidade da Inteligência Artificial

A inteligência artificial deixou definitivamente o território das experimentações e se consolidou como uma peça de infraestrutura fundamental no...

Construindo um Servidor MCP Personalizado com Node.js

Um guia prático para construir seu próprio servidor MCP para enriquecer as respostas de ferramentas de IA com contexto...

Mais Lidos

VS Code, Copilot e DBCode: Produtividade com Banco de Dados

Como Aumentar a Produtividade no Desenvolvimento com VS Code,...

Rastrear Baleias Cripto: Blueprint Para Investidores Sêniores

É possível antecipar os movimentos do mercado rastreando a...

Evolução pessoal com IA: prompt para planejar sua próxima versão

Evolução pessoal com IA: descubra como usar um prompt...

Empoderar Startups Brasileiras: Guia de Aceleração ESG

Devido ao sucesso da primeira edição, que impulsionou soluções...
E-Zine Dev

Evolua para Sênior

Estratégias de Node.js, arquitetura Limpa e IA que nunca publicamos no blog. Junte-se a +10.000 devs.

Assinar Gratuitamente Zero spam. Cancele quando quiser.

Recursos da Comunidade

Carreira Internacional

JOB NA GRINGA

Meta de Salário Remoto
U$ 5.000/mês

O mapa completo para programadores do Brasil conquistarem contratos internacionais e mudarem de vida financeira.

  • Vagas exclusivas semanais: Membros acessam vagas com 7 dias de antecedência.
  • Workshops e lives gravadas: Buscar vagas não é óbvio. Nós te mostraremos como.
  • 498 Portais de vagas: Que contratam Brasileiros direto na sua dashboard.
  • Mentorias com Recrutadores: Encontros semanais ao vivo com Erika Linares.
  • Inglês diário com foco em conversação: Treine para entrevistas num ambiente sem julgamentos.
  • Suporte pós-contratação: Contabilidade e recebimento legal com a menor taxa.
Garantir Minha Vaga

Inscrição segura via Hotmart

Você vai gostarrelacionados
Continue aprendendo

E-Zine Dev Ramos

Quer dominar arquitetura e IA?

Junte-se a +10.000 profissionais. Receba semanalmente estratégias de Node.js, React e IA que nunca publicamos no blog.

Assinar Gratuitamente Zero spam. Cancele quando quiser.