https://github.com/rafaelreisramos/nodejs-masterclass
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.
https://github.com/rafaelreisramos/nodejs-masterclass
ecmascript javascript nodejs
Last synced: over 1 year ago
JSON representation
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.
- Host: GitHub
- URL: https://github.com/rafaelreisramos/nodejs-masterclass
- Owner: rafaelreisramos
- Created: 2022-05-04T18:59:03.000Z (about 4 years ago)
- Default Branch: main
- Last Pushed: 2022-05-17T00:23:22.000Z (about 4 years ago)
- Last Synced: 2023-03-07T20:17:15.506Z (over 3 years ago)
- Topics: ecmascript, javascript, nodejs
- Language: JavaScript
- Homepage:
- Size: 313 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# 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.
- [x] Welcome and Background Information
- v8, backend javascript
- [x] Building a RESTful API
- http, https, requests, headers, payload, request, json, query strings
- [x] Building a Web App GUI
- dom api
- [x] Background Workers
- log system, gzip
- [x] Building a CLI
- readline
- [x] Performance and Stability
- cluster, child process, performance hooks
- [x] 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](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/).
## A oportunidade
Mas do :lemon: 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](https://github.com/pirple/The-NodeJS-Master-Class).
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
```js
// 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
```js
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](https://github.com/request/request/issues/3142). 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
```bash
openssl genrsa -out key.pem
```
```bash
openssl req -new -key key.pem -out csr.pem
```
```bash
openssl x509 -req -days 9999 -in csr.pem -signkey key.pem -out cert.pem
rm csr.pem
```