Node.js e HTTP: desenvolvendo uma API seguindo o estilo REST | Alura Cursos Online
Primeiras aulas do curso Node.js e HTTP: desenvolvendo uma API seguindo o estilo REST
Instalação do Node e configuração do Express - Configurando o ambiente e criando o projeto
Oi, pessoal. Tudo bem? Eu sou o Júlio, e vou estar com vocês nesse segundo curso de "Node" aqui da Alura, o segundo módulo falando sobre o "Node.js".
Então, já estou com a página do "Node.js" aqui só para a gente relembrar um pouquinho o que é esse cara, e ele é basicamente um ambiente de execução para rodar código JavaScript no backend.
Então a gente pode ver aqui na própria descrição do site, ele está falando: "É um runtime construído em cima da engine de JavaScript V8, que é a engine de JavaScript do Chrome". O que é isso? Então o pessoal pegou aquele ambiente ali que era utilizado dentro do próprio navegador Chrome para rodar JavaScript e tirou para rodar no backend, tudo bem? Para a gente poder rodar código JavaScript no backend.
Que isso dá algumas vantagens. Como a gente vai usar isso em geral para aplicações da web, o JavaScript já uma linguagem para web. Então a gente consegue reaproveitar muito comportamento do front do backend, além de requisitos que são característicos do "node" mesmo, como por exemplo, a grande capacidade dele, também está escrito aqui, de fazer "io" em execuções não blockantes. Ou seja, ele roda com uma thread só e é baseado em eventos. E ele é muito bom em fazer operações de "io". Então, isso para alguns requisitos ou para alguns sistemas, isso é bem bacana.
A gente vê que tem aqui como fazer o download. Como eu abri pelo Mac, ele já sugere o download for IOS, mas se fosse o Windows, também tem, Linux também, e tem em geral duas versões: a 4.5.0, que é a última estável, e a 6.4.0, que elas vão caminhando paralelamente, ela tem as últimas features.
Então, essa daqui, que o pessoal chama de LTS, é que em geral a gente vai usar em produção. De fato, todos os itens aqui já estão bem validados.
Então, eu já tenho tudo instalado na minha máquina, se você não tiver é só seguir o passo a passo lá, é bem tranquilo de fazer, e o primeiro ponto é verificar se realmente está tudo ok.
Então vamos vir aqui no terminal, no meu terminal aqui do Mac, que eu já deixei aberto. Se você estiver usando o Linux, use o terminal do Linux, se estiver no Windows, o terminal do Windows, não tem problema. E a gente executa aqui um código dele, "node –version", para ver se realmente eu estou com a versão que eu queria. 4.5.0. Beleza.
Nesse curso, a gente vai desenvolver uma aplicação que vai servir como uma gateway de pagamentos. Ou seja, imagina que a gente tem, por exemplo, uma livraria tipo a Casa do Código, vamos abrir aqui a Casa do Código, que é a livraria da Caelum. Vou imaginar que faz parte do nosso ambiente, então tem bastante livro de código e de outros assuntos também. E aí, a pessoa, quando clicar em "comprar", em geral ele é direcionado para uma página de compra, e normalmente os sites, os e-commerce, eles não querem implementar essa parte de fato receber o pagamento.
Então, quando a gente clicar em comprar, eu não vou entrar em detalhes de como funciona da Casa do Código, mas em geral, na hora de finalizar a compra nesse botão aqui, ele vai direcionar para outro sistema que vai comunicar, por exemplo, com o cartão de crédito e devolver a conta. Tudo bem? Então é isso o que o nosso sistema vai fazer.
A gente vai fazer isso recebendo requisições "http" e redirecionando também requisições "http". Tudo bem? A gente já entra em detalhes nisso.
O primeiro ponto é: eu tenho o "node" instalado. Agora eu preciso iniciar um projeto. O nome desse nosso sistema vai ser "Pay Fast". Então, eu já tenho aqui uma pasta que eu separei, vou dar um PWD para ver em qual pasta eu estou. Eu estou numa pasta chamada "projeto", daqui dentro do meu usuário.
Então, dentro dessa pasta, eu vou criar uma nova pasta, eu vou usar aqui o "mkdir", que é o comando para criar pastas, daí você cria também da maneira que achar mais interessante no seu sistema operacional, e eu vou criar uma pasta específica para o código. Então eu vou chamar aqui de "Pay Fast", que é o nome que a gente resolveu dar para esse sistema, o "Sistema de Pagamentos Rápidos".
Beleza. Agora eu vou navegar aqui para dentro do "Pay Fast", "cd:payfast", estou lá dentro. Vou limpar o terminal para ficar mais fácil de ver. Beleza. Aqui é onde eu quero de fato iniciar o meu código.
Para iniciar o código, a gente vai utilizar outro recurso dentro do "node", que é o "NPM", o "Node Pack Manager". É o cara que gerencia os pacotes do "node". Então, quando a gente vai criar uma aplicação em "node", em geral a gente precisa criar vários pacotes. Essa é a página dele, que fala sobre ele. Tem algo muito interessante nessa página, que é o "find pack". Se eu quiser, por exemplo, saber como eu uso o "http" no meu código, eu digito aqui "http", ele já me mostra todos os projetos que ele tem cadastrados que tem esse nome. Eu posso dar uma olhada aqui em qual talvez seja interessante. Aí depois eu vou lá e instalo o pacote. A gente vai ver nos próximos passos como instalar pacotes.
Por enquanto a gente quer o básico dele, que é iniciar um projeto. Antes de iniciar, vamos só garantir que ele também está instalado. Então, "npm –version". Beleza, eu tenho a versão 2.15.9.
Quando a gente instala o "node", NPM já vem junto, então é onde de fato deveria estar. Agora vamos iniciar o projeto. "npm.inite". Inite é o comando do NPM para iniciar um novo projeto.
Aí ele vai pedir para a gente ir configurando algumas coisas. Por exemplo, o nome. A gente já sugere "Pay Fast", que foi o nome que a gente deu para a pasta. Vamos deixar. Versão 1.0, ok. Uma breve descrição do projeto. "Um gateway para pagamentos através de recursos http". A descrição ficou bem diferente, mas é isso aí: através de recursos http. A gente pode mudar isso depois, não tem problema.
"Enter point", é o arquivo que a gente vai utilizar para executar a aplicação. Então ele já sugere algo chamado "index.js". Se eu quisesse usar outro, era só colocar o nome aqui, "outro.js". Mas eu não quero, quero usar o próprio "index", então vamos de "index.js" e vou dar um enter.
Test command seria se a gente tivesse scripts de teste já prontos para rodar. Como não tem, enter. Git repository também não temos, enter. Se tivesse, a gente já colocaria aqui. Sem problema. Keywords, palavras-chaves. Então vamos colocar aqui "gateway pagamentos api". Pronto. Porque o nosso sistema vai ser um API, um API de pagamentos.
Beleza. O autor sou eu. Vou pôr meu nome aqui só para ficar lá nos créditos. E, por último, a licença, a gente vai utilizar a própria recomendada dele. No final dessas perguntas, é gerada esse cara aqui. Ele mesmo está falando, "estou prestes a escrever", "about to write to", "o diretório onde a gente está", "payfast/package.json". Um JSON descrevendo esse projeto que estamos criando.
E aqui todas essas informações que a gente acabou de preencher estão aqui. Ele pergunta se está tudo bem, "is this ok?". Para mim parece tudo bem. Então vou dar o enter. Legal, parece que foi criado.
Vamos fazer mais um clear aqui no terminal para a gente voltar a enxergar melhor. E vamos ver o que aconteceu. Se eu fizer um "LS" aqui dentro dessa pasta, aparece "package.json". Então, esse arquivo aí que a gente de fato a gente acabou de criar, é o cara que descreve o nosso projeto.
Bom, para a gente poder ver e editar código, eu vou usar aqui uma ideia que eu acho bem interessante, que é o "atom". Fica a critério de cada um utilizar o que achar mais interessante. Eu estou com uma página dele aberta, "atom.io".
Quem tiver interesse em utilizar é só vir aqui e baixar de boa. Ele é grátis e tal. Bem tranquilo. O pessoal que trabalha com outras IDEs também não tem problema, usa o que achar mais legal. Bastante gente gosta do Sublime, por exemplo.
Dentro aqui do "atom", agora a gente vai lá em "file" e vai adicionar um novo "project folder". "Add folder". E, óbvio, o "project folder" é esse "project folder" que a gente acabou de criar, "pay fast", que está dentro de "projeto". "Documents", "Júlio Vidal", "Projeto", "Pay Fast". Abri esse cara.
Abrindo, a gente já tem aqui o nosso package de JSON, aquele mesmo arquivo que a gente viu lá no terminal, e agora aqui no "atom" ele já dá aquela formatada bonita e a gente pode ver que todas as informações estão aqui.
Pessoal, isso daqui é o básico para a gente criar o nosso projeto e para a gente começar a trabalhar com o "node". Então eu recomendo agora você já verificar o seu ambiente, garantir que está tudo instalado certinho, e de repente dá uma lida aí na descrição dessa aula para a gente ver bem legal como que vai ser de fato o código que a gente vai escrever para implementar essa API de pagamentos utilizando o nosso número Node.js.
E aí, nas próximas aulas, a gente já começa de fato a escrever o código. Então manda bala nisso aí e já volta para ver a próxima aula. Até mais.
Instalação do Node e configuração do Express - Criando a primeira rota e usando o Nodemon
Pessoal, beleza? Continuando, então, aqui com o nosso projeto, agora a gente já tem basicamente o projeto criado, simplesmente isso. Então ainda tem bastante coisa para fazer, obviamente, e a primeira é a gente começar a escrever o código, de fato, do nosso gateway de pagamentos que utiliza recursos "http", que a gente chamou de "Pay Fast".
Pessoal, aqui no "package.json", que vocês já devem ter feito exercício que a gente criou na última aula, a gente falou que o nosso arquivo de início seria o "index.js", mas a gente ainda não tem esse arquivo.
Bom, têm duas opções. A gente pode criá-lo aqui, vir com o botão direito, "new file", e criar. Ou, só para a gente ver mais uma brincadeirinha no terminal, vou criar ele aqui.
Então, "touch", que é um comando do terminal para eu criar, tocar um arquivo, ver se ele existe ou não. Se ele não existir, ele cria. Então, "touchindex.js", criamos esse arquivo. Se eu fizer aqui um "LS –LA", beleza. Além do "package.json", tem o "index.js".
A gente tinha a aplicação rodando, então vou voltar a rodar aqui. Vamos rodar "nodeindex.js", já que agora a gente tem o arquivo para rodar. Rodamos. Mas ele já liberou o terminal. A gente queria que isso aqui fosse, na verdade, um API que recebesse requisições "http", então parece que não está muito bem. E faz todo o sentido, afinal a gente ainda não escreveu o código desse "index.js".
Vamos voltar aqui no "atom" e vamos ver que ele já apareceu aqui. Abrindo aqui o "index.js", ainda não tem nada. O que a gente quer que ele tenha é receber requisições "http".
Para receber requisições "http", a gente vai pedir ajuda de uma "lib" bastante conhecida do mundo "node" que é o "express". Então vamos fazer o "npminstall –saveexpress". É bem tranquilo para quem fez o primeiro curso, a gente usa essa mesma "lib", ela é de fato bem utilizada para abstrair essas necessidades de implementação do "http".
Então eu limpei aqui o terminal para garantir, ter certeza que de fato instalou. A gente vem aqui no nosso "package.json" e agora a gente tem uma nova chave, a chave "dependences". E a gente vê que aqui dentro apareceu o "express". Então está instalado. Então está beleza.
Para a gente começar agora a escrever de fato o código, agora a gente precisa carregar essa "lib" que a gente acabou de criar, então eu vou criar uma variável para ela, vou chamar aqui de "express", e eu vou fazê-la através do comando "require", vou fazer ela ser carregada. Então "var express" recebe "require", e a gente coloca aqui essa nova "lib" que a gente acabou de carregar.
Com esse "express" em mãos, a gente, agora, a partir da variável "express", que eu estou selecionando aqui na tela, de fato carregar o objeto que ela contém lá dentro. A gente sabe que no "require" ele carrega o arquivo. Agora, para a gente conseguir, de fato, o objeto, as funcionalidades, a gente vai precisar instanciar essa função.
Então eu já vou criar uma variável chamada "app", beleza, e vou fazer essa variável "app" agora e receber a invocação da variável que a gente declarou na primeira linha. Então primeiro eu declarei o "express" e agora eu estou aqui carregando o "express" e estou atribuindo ao "app".
Beleza. Essa variável "app" é o objeto, ela é a referência agora para esse objeto do "express". Então sempre que a gente falar "objeto do express", vai ser esse carinha aí. E ele tem, então, todas as funcionalidades do "express". Uma delas é o "listen", a função "listen", que define que eu estou ouvindo em uma determinada porta, ou seja, eu quero que a minha aplicação passe a ouvir, por exemplo, na porta 3000.
E só isso já é suficiente para a gente ter uma "thread" rodando para atender requisições "http". Como a gente vai provavelmente querer executar algum código no momento que começar a rodar, pelo menos para a gente saber que de fato o negócio está funcionando, vou criar aqui uma função de callback, esse estilo de programação aí que é bem comum do JavaScript, do "node".
Então, beleza. Dentro dessa função de callback, agora a gente vai simplesmente colocar um "console.log", e vai imprimir "servidor rodando na porta 3000". Vou salvar esse cara. Agora vamos voltar lá no terminal e vamos executar aqui de novo. Então, "nodeindex.js", "servidor rodando na porta 3000".
Isso significa, obviamente, que se eu for aqui, agora, no Chrome, no navegador, qualquer que seja, e digitar "localhost: 3000", eu devo chegar nesse nosso código. De fato ele chegou em algum local, se esse negócio não existisse, nem daria resposta nenhuma. Mas dele deu aqui um "cannot get /". Quer dizer, a gente tentou acessar aqui, na verdade, o endereço na barra. Então, está aparecendo essa barra aqui, mas a gente não definiu nenhuma requisição, nada para ser atendido nessa barra.
E nem é isso que a gente quer. Na verdade, o que a gente quer é atender, por exemplo, uma "url" que seja "/pagamentos" ou algo do tipo, aí a gente vai começar a receber as requisições.
Bom, já que apareceu esse teste no meu navegador, vamos ver o que acontece se eu clicar nele. Também não acontece nada, porque também é uma outra rota que também não existe.
Vamos começar, então, definindo essa rota de teste, só para a gente ver como que faz. A partir do meu objeto "app", que a gente usou para subir o servidor através do "listen", a gente pode definir rotas, pode definir verbos, métodos "http" que a gente quer atender. Nesse caso eu quero, por exemplo, que através de um "get" eu consiga devolver alguma coisa para a sua "url" aqui, "/teste".
Então, nesse "app" aqui a gente vai colocar "/teste", ou seja, toda vez que a gente digitar lá o nosso domínio "/teste", vai ser atendido por esta função de call-back que eu vou definir aqui agora. Essa funçãozinha de callback que a gente está usando para atender a esse método "get" aqui.
Uma coisa legal aqui do "express" é que quando a gente cria as funções de callback para atender as requisições, ele já deixa disponível para a gente receber como parâmetro os objetos request e respawn. Se a gente dar dois nomes para ele aqui, eu chamo ele de "req" e "res".
A princípio, a gente vai outro "console.log", então simplesmente para avisar que recebida a requisição de teste, vamos colocar assim, vamos desencanar dos sinais gráficos, sem esse tipo de coisa, mas a gente também vai dar uma resposta, então, para o cliente, que está consumindo. Então vamos fazer isso através do "res.send". O "res.send", basicamente eu estou pegando aqui o objeto "response" e vou enviar uma resposta, uma resposta bem simples para ele também. Vou falar, vou dar um "ok" bem simples aqui.
Então eu vou colocar aqui um ";" e isso daqui já deve funcionar. Vou salvar. Agora vou lá no navegador e vou tentar atualizar aqui, vou clicar no botão de atualizar, continua a mesma resposta.
"command + r" aqui, para atualizar para atualizar no Chrome também, a mesma coisa. Bom, é óbvio, a gente mudou o código lá no "index.js", mas a gente não fez essa mudança sem refletir de fato no que está rodando. O nosso servidor que estava rodando na porta 3000 continua com o código antigo.
Então, para que ele passe a funcionar, vamos parar, eu usei o "control + c" para matar o processo, no Linux deve ser semelhante, e no Windows também tem a forma de matar o processo, então cada um vê como faz. E a gente vai lá e roda de novo o "index.js".
De novo a mesma mensagem, o servidor rodando na porta 3000, que é essa daqui do "listen", está ok, então. E vamos agora ver aqui se a gente consegue uma resposta nessa "url/test"; Agora sim, dei o enter aqui, a gente recebeu o ok. Se tudo tiver dado certo, também deve ter sido exibida essa nova mensagem aqui no console.
Então vamos dar uma olhada lá. Receberam. Recebida a requisição de teste. Então beleza, parece que está tudo ok. Bom, você viu que só com esses dois exemplos que sempre que a gente precisar alterar alguma coisa aqui no código, como a gente fez agora, a gente vai ter que reiniciar o servidor.
Então vamos supor que a gente agora não queira mais esse log aqui, esse log aqui não está mais tão interessante. Vamos deixar ele aí por enquanto. Mas se eu tirar, eu vou ter que reiniciar. Para gente evitar ficar tendo que reiniciar o servidor o tempo inteiro, tem um outro módulo lá bem bacana do "node", que inclusive a gente usou no primeiro curso também, que é o "nodemon".
Então eu vou instalar esse cara aqui, "npminstall –g nodemon". "-g" porque eu quero que ele seja global para essa máquina. O "-g" ele serve para instalar o pacote globalmente, ou seja, diferente daqueles que a gente estava fazendo até então, que instalava só para o projeto, esse aqui ele vai servir para todos os usuários da máquina. Vou fazer um "clear". E agora, ao invés da gente rodar com o "node", a gente vai rodar com o "nodemon". Então "nodemon index.js". Ele já exibe as informações, qual é a versão dele. Ele fala que "para qualquer momento para reiniciar, digite RS", fala que está vendo tudo que está dentro do diretório que der para especificar também quais que a gente quer que ele fique ali verificando as alterações.
E inclusive ele fala para gente: "Starting nodeindex.js". Ele executa o próprio comando "node" que a gente estava executando, só que agora ele faz lá por baixo. E aqui o servidor rodando na porta 3000.
Então vamos supor que agora a gente queira, na verdade... Vamos só testar se continua tudo funcionando, então fiz a requisição aqui na 3000, o servidor apareceu, recebido a requisição de teste, beleza.
Só que agora a gente vai mudar só essa mensagem aqui. Recebida a requisição de teste na porta 3000. Só para a gente ver se vai funcionar mesmo. Na porta 3000 eu vou salvar aqui com o "Cmd + S", beleza.
E aí, voltando aqui no terminal, dá para ver que ele mesmo faz o restart. Fala aqui: "restarting due to changes", então "reiniciando devido a mudanças". Iniciando o "nodeindex.js", e aí, de novo, o servidor rodando na porta 3000.
A gente não precisou parar e rodar novamente. Vou atualizar. E agora, a mudança que deve acontecer é na frase. Antes a gente tinha recebido a requisição de teste, e agora recebida a requisição de teste na porta 3000. Então parece que está tudo bem.
Então, legal. A gente agora já tem como receber requisições na nossa API de pagamento, primeiro uma requisição de teste, mas a gente viu que é bem rápido. Então criar um projeto com o "node" que recebe uma requisição web usando o "express" é bem tranquilo.
Então já vamos deixar um exercício para você fazer, para vocês fazerem, implementando esse primeiro arquivo, e a seguir a gente vai ver como que a gente organiza um pouco melhor esse código e todas as dependências dele. Então até o próximo.
Instalação do Node e configuração do Express - Isolando o config do express e usando o Consign
Agora que a gente já tem a primeira rota funcionando, que é essa rota aqui de teste, vamos começar a criar as rotas de verdade da nossa aplicação. Então, a primeira que a gente vai querer criar muito provavelmente vai ser algo assim: "/pagamentos". Ou seja, eu quero uma "url" para eu poder consultar os pagamentos, pelo menos fazer um teste aqui com o nome real.
Então, a maneira mais fácil que a gente tem de fazer isso agora é: posso vir aqui simplesmente nessa rota de teste que já foi criada e substituir a "url" dela por "pagamentos". Então a gente vai salvar esse cara. A gente pode confirmar aqui no terminal se realmente ele reiniciou. Como sempre, faz aqui o restarting. Startar novamente. Então tudo bem. E vamos agora atualizar aqui a página e aí a gente viu que agora a gente consegue ter uma resposta aqui nessa "url" "pagamentos".
Bom, ok. Só que a gente sabe que essa aplicação, ela vai tender a crescer. Como toda aplicação, a gente precisa organizar bem o nosso código. Se a gente olhar para esse arquivo "index.js", vamos dar uma analisada nele aqui. A gente vai ver que ele está fazendo já mais coisas do que deveria.
Lembra que esse cara, ele está listado aqui na nossa "package.json" como sendo o "main script" da aplicação, o cara que roda a aplicação. Essa que deve ser a funcionalidade dele. E aqui ele, além de estar rodando a aplicação, ele também está gerenciando, configurando uma rota. Então ele está servindo aqui como controlador também, não está fazendo mais do que deveria.
Vamos começar, então, a organizar a nossa aplicação em diretórios. Dentro aqui do nosso "payfast", vou criar um novo folder. Vou chamar de "controllers". E é onde a gente vai agora armazenar os arquivos que definem rotas para a nossa aplicação.
A gente convencionou chamar de "controllers", tem gente que prefere routes, aí cria um diretório routes, rotas, controladores. Enfim, é como você achar mais interessante.
Dentro dessa pasta, então, na verdade, vamos criar um novo arquivo que é específico para as rotas de pagamentos. Então eu vou chamar esse cara de "pagamentos.js", e, obviamente, agora dentro desse cara, eu preciso ter aqui esse código.
Em vez da gente ter, e eu vou fazer aqui um "control + x", vou recortar, e em vez da gente ter agora um "index" definindo essa rota, eu vou ter esse cara aqui. "app.get pagamentos". Beleza.
Será que isso daqui vai ser suficiente? Vou salvar esse arquivo, vou salvar o outro. Vou ver aqui se o "nodemon" vai reiniciar. Já reiniciou. Beleza. Vamos executar a mesma url para ver se continua funcionando. Deu problema. "cannot get pagamentos".
Mas isso era esperado mesmo, porque nesse arquivo "pagamentos.js", a gente ainda não tem essa variável "app", e ela precisa vir de algum local. Como a gente vai fazer para ter essa variável "app" dentro desse código?
A gente sabe que no mundo do "node" existe uma maneira da gente receber atributos e exportar atributos que é através do "module.exports". Então, o que a gente vai querer é o seguinte. Eu quero que esse meu arquivo ".js", ele receba no "module.exports" dele uma função que a gente vai, dentro dessa função, definir que a gente consegue invocar uma rota através do método "get" para variável "pagamentos". E essa função, ela vai receber como parâmetro, o "app".
Tá, mas ainda está meio esquisito. Como isso vai funcionar? Vamos salvar e vamos ver aqui se isso vai realmente funcionar ou não. O servidor está rodando, parece que está tudo bem. Vamos ver se agora a gente chega nessa rota. Ainda não está chegando.
O que está acontecendo é o seguinte. Como que esse negócio vai, de fato, chegar até aqui se a gente simplesmente não definiu que o "express" precisa conhecer esse diretório. Dentro aqui do "index.js" a gente carregou a "lib" do "express" e declarou a variável. Isso aqui é um arquivo separado. Então isso é algo que vai ser bastante comum de acontecer, e o "express", ele é o cara que vai gerenciar toda a nossa aplicação, e vão ter vários módulos que vão ser adicionados a ele.
Então vamos criar aqui logo uma nova pasta, vamos chamar de "config", por exemplo, e dentro desse cara a gente pode criar um novo arquivo para a gente poder definir todas as configurações do "express" que a gente precisar. Vou chamar esse cara de "custom-express.js".
Então, dentro de "config", criamos aqui "custo-express.js", e a gente até pode ganhar uma melhor definição para o nosso "index". Veja que o "index", ele está carregando o "express" e está iniciando a aplicação. Então ele está com duas responsabilidades aí também.
Vamos diminuir um pouco as responsabilidades desse cara. Vamos então colocar esse "custom express", que ele é o cara que ele é o cara que é específico para escrever código do "express", para carregar agora a "lib", e aqui dentro dele a gente cria também o "module.export" desse cara, faz ele receber uma function, e esse aqui é o cara que a gente vai conseguir exportar para o mundo.
Então eu vou colocar essa variável "app" agora aqui dentro, e a gente agora vai ter o seguinte. Carreguei a "lib" do "express" aqui, carreguei a variável "app", e agora eu vou retornar a própria "app".
E com isso a gente pode fazer uma nova mudança aqui no "index.js". Em vez dele ir agora fazer o carregamento aqui do "express", e a gente não precisa porque já está fazendo lá no outro cara, isso aqui é como se ele estivesse duplicado, e a própria variável "app", a gente quer, na verdade, conhecer essa variável "app" que a gente criou aqui no "custom express". Ou seja, a gente quer carregar o que vai ser retornado dessa função aqui do "module.exports".
Essa é a funcionalidade do "module.exports". Quando a gente cria esse cara, a função que a gente definir para ele é a função que vai ser retornada quando eu vier aqui, por exemplo, e fizer um "require" apontando para esse arquivo.
Então eu vou fazer um "require", vou identificar o arquivo que a gente quer como "config", que é a pasta onde ele está, "config/custom-express".
Feito isso, vou salvar e tentar mais uma vez. Vamos ver se agora vai. Agora não ficou nada legal. Deu: "refuse to connect". Ele deu um erro e falou que ele não consegue encontrar o "module config/custom.express". Vamos ver o porquê isso aconteceu.
Voltando aqui no "atom", a gente tem o "index" que está na raiz e faltou identificar com "./", porque ele tem que saber a partir de onde ele deve procurar esse arquivo. Então vamos ver se está tudo escrito certo. "Config custom-express". Vamos ver o servidor.
Tem um detalhe interessante: às vezes quando o "node" quando dá um problema inesperado, ele não consegue se recuperar. Isso daqui a gente não tem muito o que fazer. Então eu matei o processo aqui com o "control + c", limpei a tela, vou tentar rodar novamente. Mas continua com problema. Vamos ver o que ele está falando agora. Ele está falando que a variável "app" não é uma função. Ou seja, vocês estão vendo que no "index.js", na linha 3, a variável "app.listen". Ele está falando que "app.listen" não é uma função. Vamos entender por quê.
A gente tem a variável "app", e a gente está fazendo a variável "app" receber o carregamento desse arquivo. Já sei o que é. Quando a gente faz ele receber o carregamento do arquivo é como se eu estivesse pegando esse código inteiro e carregando aqui na variável.
Tudo bem. Só que a variável precisa ter o valor do objeto, ou seja, o que está sendo retornado dentro dessa função. Então, para fazer isso, a gente precisa carregar o arquivo e invocar o código. Beleza.
Exatamente como a gente fez, por exemplo, aqui. Só que aqui a gente fez passo a passo. Carregou o "express", guardou na variável e depois foi lá e invocou. Aqui a gente fez em um passo só. Então carregou através do "require" e já invocou direto aqui na sequência.
Então agora a variável "app" deve ter de fato a referência por objeto. Deu para ver que ele reiniciou mais uma vez e agora não acusou nenhum erro. Vamos então tentar para ver se a gente chegar. Bacana. A gente voltou aqui para o erro anterior, continua não achando pagamentos.
Tudo bem. Isso também tem uma explicação. A gente fez agora o carregamento correto, isolou a configuração do "express", só que o "pagamentos.js", ele ainda está numa pasta chamada "controllers" que ninguém conhece muito bem. Esse "app" está inacessível. O "express", ele não sabe que isso existe. A gente inicia o "express" pelo index, fala que ele está pronto para receber conexões, mas a gente não falou aqui para esse cara, em momento nenhum para esse "app" aqui, que ele deve ter esse "get" registrado para pagamentos. O que vai acontecer nessa situação é o seguinte. A gente precisa sempre definir, ou é uma boa prática a gente definir, quais são os nossos arquivos que vão definir as rotas da aplicação. No nosso caso, são todos que estiverem dentro aqui de "controllers".
Vamos então criar uma nova aba. Eu vou digitar um "command + t" no terminal para a gente ficar com uma aba sempre rodando o código e outra para a gente utilizar conforme o necessário. A gente vai usar um novo pacote aqui para nos ajudar no gerenciamento dessas partes. Essa nova "lib" que a gente vai utilizar através do "npm install –save", é uma "lib" chamada "consign".
Então vamos instalar esse carinha aqui. O "consign" basicamente é um cara que ajuda no carregamento das rotas. Ele é uma evolução, ou é o sucessor daquela "lib" que é utilizada no primeiro curso, que é o "express load". Ele é basicamente assim. A vantagem dele é que ele é pouco mais leve, e ele é independente do framework. Então ele funciona não somente com "express".
Uma vez que a gente já instalou, parece que foi tudo bem, a gente pode ver aqui no "package.json", realmente está aqui, está instalado. Agora, para a gente utilizar esse cara, a primeira coisa que a gente vai fazer é definir uma variável aqui para o "consign" e fazer o bom e velho "require".
Então, "require", e aí, como sempre a gente abre e fecha parênteses, já vou pôr o ponto e vírgula, abre aspas, e coloca o nome da "lib", "consign". Para fazer esse cara agora funcionar, a gente tem que vir aqui e invocá-lo, assim como a gente fez também com o "express", só que a gente só não vai atribuir esse cara para uma variável. Simplesmente a gente vai invocar, e a gente vai falar o que a gente quer incluir agora dentro do objeto do "express".
Olha que legal, ele tem essa "api" que é toda naquela linguagem fluente de código. Vamos ver se está tudo certo. Parece que sim. O que a gente quer incluir dentro da variável, dentro da variável "app", é a nossa pasta de "controllers". Então a gente vai vir aqui no "include", vai colocar as aspas, "controllers", e a gente vai jogar esse cara aqui agora dentro da variável "app".
Bom, se tudo der certo, o que a gente vai ter agora é o seguinte. Essa variável "app" que a gente está carregando aqui e retornando para o "index.js", e pedindo para ele ouvir conexões na porta 3000, ela vai passar a ter dentro dela todo o conhecimento que a gente tem na pasta "controllers".
Bom, já que está tudo salvo, vamos ver no terminal se aconteceu alguma coisa, aqui onde está rodando o "nodemon". Olha que legal, ele está falando que reiniciou por causa das mudanças, vou dar uns enters aqui para ficar melhor para visualizar, e ele já fala, ele já loga aqui alguma coisa do "consign" falando que ele foi inicializado aqui dentro do "payfast", e ele já reconheceu aqui o "pagamentos.js" dentro do diretório "controllers". E aí depois o nosso log próprio, servidor rodando na porta 3000.
Na teoria está tudo bonito. Vamos atualizar a página. Olha, beleza. Parece que realmente funcionou.
Então, recapitulando. Agora a gente conseguiu evoluir bastante o nosso código aqui nessa pequena aula. A gente passou a ter agora mais duas estruturas aqui de organização, a pasta "config", que tem dentro dela o "custom-express", que é onde a gente isolou todas as configurações customizadas do "express". A gente criou também a pasta "controllers", onde a gente vai escrever as rotas ou os controladores da nossa aplicação. Dentro dela, a gente criou o primeiro controle que, na verdade, a gente só aproveitou que a gente tinha criado lá de teste e mudou para pagamentos. E definiu ele dentro do "module.export" desse cara.
Isso significa que ele agora está disponível para quem for utilizar. Bom, lá no próprio "custom express" a gente definiu também, através do "consign", que agora a gente deveria incluir a pasta "controllers" dentro do objeto "app".
Então, objeto "app" que está rodando lá no "index" ouvindo requisições, ele passa a conhecer essa rota e passa a saber a rota "pagamentos.js", ou melhor, o controlador de "pagamentos.js", e saber que ele tem essa rota aqui, "get/pagamentos".
Então essas requisições agora devem ser atendidas da maneira esperada. Então vamos fazer o exercício aí rapidamente para vocês definirem essa nova proposta de organização, essa nova rota, e a gente já vai com mais aula. E aí, de fato, vai começar a receber os pagamentos. Até logo.
Sobre o curso Node.js e HTTP: desenvolvendo uma API seguindo o estilo REST
O curso Node.js e HTTP: desenvolvendo uma API seguindo o estilo REST possui 402 minutos de vídeos, em um total de 82 atividades. Gostou? Conheça nossos outros cursos de Node.JS em Programação, ou leia nossos artigos de Programação.