Skip to content

Uma api, uma web gui, uma cli e background workers desenvolvidos em Node.js sem frameworks com base no curso Pirple Node.js Masterclass, refatorados para uma versão mais moderna de Javascript.

Notifications You must be signed in to change notification settings

rafaelreisramos/nodejs-masterclass

Repository files navigation

Node.js Masterclass

Pirple Node.js Masterclass

Uma Breve Introdução

Este projeto/repositório é baseado no curso Node.JS Masterclass da Pirple. Adquiri este curso em uma oferta irrisória de R$ 10,00 em Junho de 2021.

A proposta do curso é passar por todos os módulos da documentação do Node.js e aplicar na criação de um projeto sem nenhum framework.

A grade básica é apresentada abaixo.

  • Welcome and Background Information
    • v8, backend javascript
  • Building a RESTful API
    • http, https, requests, headers, payload, request, json, query strings
  • Building a Web App GUI
    • dom api
  • Background Workers
    • log system, gzip
  • Building a CLI
    • readline
  • Performance and Stability
    • cluster, child process, performance hooks
  • Loose Ends
    • http2, vm, tls/ssl, udp, repl, async hooks

Embora passe por boa parte dos módulos do Node.js, o conteúdo do curso não está atualizado e é baseado em uma versão 8 do Node.js.

Para aprender Node.js hoje eu não aconselharia você a comprar este curso. Existem opções melhores como o Ignite da Rocketseat, o curso do Eric Wendel os cursos do Manguinho. Existem boas opções tanto no Youtube como no freeCodeCamp.

A oportunidade

Mas do 🍋 uma limonada.

Sempre existe uma oportunidade. Olhando os módulos resolvi aproveitar os ensinamentos do curso me impor o desafio de colocar em prática uma refatoração pesada em todos o módulos com a versão mias recente do Node.js (versão 18 em maio de 2022).

Seguindo a premissa original, não utilizei frameworks. Apenas instalei o dotenv e o dotenv-expand para configuração das variáveis de ambiente e o nodemon para restart automático no módulo de desevolvimento. Estes móduos não instalam nenhuma dependência adicional

O código original pode ser visto neste repositório NodeJS Masterclass.

Posso dizer que isto foi muito bom para aprimorar meus conhecimentos e que estou bastante feliz com o aprendizado.

O desafio

A api original era baseada em callbacks e chega a ter até 6 níveis de profundidade, em um padrão conhecido como callback hell. A leitura do código era difícil.

Como exemplo você pode ver o código original da lib de acesso ao sistema de arquivos (que no curso é usada como a base dados) original

// Update data in a file
lib.update = function (dir, file, data, callback) {
  // Open the file for writing
  fs.open(
    lib.baseDir + dir + "/" + file + ".json",
    "r+",
    function (err, fileDescriptor) {
      if (!err && fileDescriptor) {
        // Convert data to string
        var stringData = JSON.stringify(data)

        // Truncate the file
        fs.truncate(fileDescriptor, function (err) {
          if (!err) {
            // Write to file and close it
            fs.writeFile(fileDescriptor, stringData, function (err) {
              if (!err) {
                fs.close(fileDescriptor, function (err) {
                  if (!err) {
                    callback(false)
                  } else {
                    callback("Error closing existing file")
                  }
                })
              } else {
                callback("Error writing to existing file")
              }
            })
          } else {
            callback("Error truncating file")
          }
        })
      } else {
        callback("Could not open file for updating, it may not exist yet")
      }
    }
  )
}

e refatorado usando fs/promises e async/await

async function fileUpdate(dir, file, data) {
  let fileHandle
  try {
    fileHandle = await fs.open(path.join(baseDir, dir, `${file}.json`), "r+")
    await fileHandle.truncate()
    await fileHandle.writeFile(JSON.stringify(data))
  } catch (e) {
    debug(e.message)
  } finally {
    fileHandle?.close()
  }
}

As requisição a api, no caso do frontend, era feita através de XMLHttpRequest e no backend o request era feito usando o Request, agora depreciado. Ambas foram substituídas pelo novo módulo fetch do Node.js.

Optei por usar o máximo possível promises e async/await na construção do código. Também alterei o status de algumas das respostas da api para os quais acredito que sejam mais adequados.

No módulo de testes fiz uma pequena experiência com o test runner do Node.js 18 mas não ampliei para os testes da api.

Como o curso não tem base em TDD e não é focado em testes, a api não tem uma cobertura de testes adequada e não pude verificar se o funcionamento é exatamente igual ao do curso. Podem existir detalhes da implementação levemente diferentes.

O código original do frontend foi pouco refatorado, é desestruturado e confuso. O objetivo é melhorá-lo em breve, usando vanilla Javascript, sem frameworks.

Como desafio final na parte da api, apliquei o design pattern Model-View-Controller (MVC).

Conclusões

Espero que sirva de inpiração para seus desafio e qualquer comentário ou melhoria é so fazer um PR que eu avalio para eu aprender com as sugestões também.

O que poderá ser feito (sem compromisso)

  • Melhorias do layout da web GUI usando técnicas simples com display flex
  • Refatoração do código do frontend usando módulos, separando as responsabilidades.
  • Roteamento baseado em páginas no frontend (similar ao Next)
  • Middlewares para validação e autenticação na api

Notas gerais

Geração do certificado do servidor

openssl genrsa -out key.pem
openssl req -new -key key.pem -out csr.pem
openssl x509 -req -days 9999 -in csr.pem -signkey key.pem -out cert.pem
rm csr.pem

About

Uma api, uma web gui, uma cli e background workers desenvolvidos em Node.js sem frameworks com base no curso Pirple Node.js Masterclass, refatorados para uma versão mais moderna de Javascript.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published