{"id":13299577,"url":"https://github.com/rafaelreisramos/nodejs-masterclass","last_synced_at":"2025-03-10T11:31:57.699Z","repository":{"id":124001237,"uuid":"488710622","full_name":"rafaelreisramos/nodejs-masterclass","owner":"rafaelreisramos","description":"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.","archived":false,"fork":false,"pushed_at":"2022-05-17T00:23:22.000Z","size":320,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2023-03-07T20:17:15.506Z","etag":null,"topics":["ecmascript","javascript","nodejs"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rafaelreisramos.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-05-04T18:59:03.000Z","updated_at":"2022-06-14T00:41:48.000Z","dependencies_parsed_at":null,"dependency_job_id":"d77ae9ae-e7f5-4865-a286-a0c5d93318c6","html_url":"https://github.com/rafaelreisramos/nodejs-masterclass","commit_stats":null,"previous_names":[],"tags_count":0,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafaelreisramos%2Fnodejs-masterclass","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafaelreisramos%2Fnodejs-masterclass/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafaelreisramos%2Fnodejs-masterclass/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafaelreisramos%2Fnodejs-masterclass/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rafaelreisramos","download_url":"https://codeload.github.com/rafaelreisramos/nodejs-masterclass/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242843002,"owners_count":20194301,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ecmascript","javascript","nodejs"],"created_at":"2024-07-29T17:37:45.013Z","updated_at":"2025-03-10T11:31:57.689Z","avatar_url":"https://github.com/rafaelreisramos.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Node.js Masterclass\n\n![Pirple Node.js Masterclass](.github/cover.png)\n\n## Uma Breve Introdução\n\nEste 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.\n\nA 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.\n\nA grade básica é apresentada abaixo.\n\n- [x] Welcome and Background Information\n  - v8, backend javascript\n- [x] Building a RESTful API\n  - http, https, requests, headers, payload, request, json, query strings\n- [x] Building a Web App GUI\n  - dom api\n- [x] Background Workers\n  - log system, gzip\n- [x] Building a CLI\n  - readline\n- [x] Performance and Stability\n  - cluster, child process, performance hooks\n- [x] Loose Ends\n  - http2, vm, tls/ssl, udp, repl, async hooks\n\nEmbora 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.\n\nPara aprender Node.js hoje eu não aconselharia você a comprar este curso. Existem opções melhores como o [Ignite da Rocketseat](https://www.rocketseat.com.br/ignite), o curso do [Eric Wendel](https://cursos.erickwendel.com.br/) os cursos do [Manguinho](https://rmanguinho.github.io/). Existem boas opções tanto no [Youtube](https://www.youtube.com/) como no [freeCodeCamp](https://www.freecodecamp.org/).\n\n## A oportunidade\n\nMas do :lemon: uma limonada.\n\nSempre 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).\n\nSeguindo 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\n\nO código original pode ser visto neste repositório [NodeJS Masterclass](https://github.com/pirple/The-NodeJS-Master-Class).\n\nPosso dizer que isto foi muito bom para aprimorar meus conhecimentos e que estou bastante feliz com o aprendizado.\n\n## O desafio\n\nA 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.\n\nComo 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\n\n```js\n// Update data in a file\nlib.update = function (dir, file, data, callback) {\n  // Open the file for writing\n  fs.open(\n    lib.baseDir + dir + \"/\" + file + \".json\",\n    \"r+\",\n    function (err, fileDescriptor) {\n      if (!err \u0026\u0026 fileDescriptor) {\n        // Convert data to string\n        var stringData = JSON.stringify(data)\n\n        // Truncate the file\n        fs.truncate(fileDescriptor, function (err) {\n          if (!err) {\n            // Write to file and close it\n            fs.writeFile(fileDescriptor, stringData, function (err) {\n              if (!err) {\n                fs.close(fileDescriptor, function (err) {\n                  if (!err) {\n                    callback(false)\n                  } else {\n                    callback(\"Error closing existing file\")\n                  }\n                })\n              } else {\n                callback(\"Error writing to existing file\")\n              }\n            })\n          } else {\n            callback(\"Error truncating file\")\n          }\n        })\n      } else {\n        callback(\"Could not open file for updating, it may not exist yet\")\n      }\n    }\n  )\n}\n```\n\ne refatorado usando fs/promises e async/await\n\n```js\nasync function fileUpdate(dir, file, data) {\n  let fileHandle\n  try {\n    fileHandle = await fs.open(path.join(baseDir, dir, `${file}.json`), \"r+\")\n    await fileHandle.truncate()\n    await fileHandle.writeFile(JSON.stringify(data))\n  } catch (e) {\n    debug(e.message)\n  } finally {\n    fileHandle?.close()\n  }\n}\n```\n\nAs 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](https://github.com/request/request/issues/3142). Ambas foram substituídas pelo novo módulo fetch do Node.js.\n\nOptei 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.\n\nNo 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.\n\nComo 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.\n\nO código original do frontend foi pouco refatorado, é desestruturado e confuso. O objetivo é melhorá-lo em breve, usando vanilla Javascript, sem frameworks.\n\nComo desafio final na parte da api, apliquei o design pattern Model-View-Controller (MVC).\n\n## Conclusões\n\nEspero 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.\n\n## O que poderá ser feito (sem compromisso)\n\n- [ ] Melhorias do layout da web GUI usando técnicas simples com display flex\n- [ ] Refatoração do código do frontend usando módulos, separando as responsabilidades.\n- [ ] Roteamento baseado em páginas no frontend (similar ao Next)\n- [ ] Middlewares para validação e autenticação na api\n\n## Notas gerais\n\n### Geração do certificado do servidor\n\n```bash\nopenssl genrsa -out key.pem\n```\n\n```bash\nopenssl req -new -key key.pem -out csr.pem\n```\n\n```bash\nopenssl x509 -req -days 9999 -in csr.pem -signkey key.pem -out cert.pem\nrm csr.pem\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frafaelreisramos%2Fnodejs-masterclass","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frafaelreisramos%2Fnodejs-masterclass","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frafaelreisramos%2Fnodejs-masterclass/lists"}