Criando serviços com Node.js

Giuliana Bezerra
Desenvolvimento com Node.js
6 min readMay 13, 2019

Construir serviços é uma tarefa rotineira dos desenvolvedores backend. É bastante comum expor APIs externa ou internamente utilizando serviços REST. Tendo em vista essa crescente demanda de construção de serviços, elaborei esse post para explicar como, e de forma simples, podemos construir um serviço REST. Existem inúmeras tecnologias que visam facilitar essa tarefa, e nesse post iremos utilizar o Node.js com o Express para construir um serviço CRUD de usuário.

Requisitos

O leitor deve estar familiarizado com a linguagem Javascript, Node.js e Express. Para saber um pouco mais sobre o Node.js, recomendo a leitura desse post. No que diz respeito ao Express, recomendo a leitura desse post.

Criação do Projeto

Nesse etapa será necessário utilizar editor para o desenvolvimento. Você pode usar algum de sua preferência, eu irei utilizar aqui o Visual Studio Code, que é uma das mais populares ferramentas para desenvolvimento com Javascript.

Vamos começar então criando uma pasta chamada servico-nodejs no editor:

servico-nodejs no Visual Studio Code.

A estrutura de um projeto no Node.js costuma seguir um padrão, baseado nas boas práticas de desenvolvimento. Vamos adotar o seguinte padrão:

Estrutura do projeto servico-nodejs.

💡 Nosso projeto exemplo é simples, por isso sua estrutura ficou pequena. Em serviços mais robustos também poderíamos ter uma pasta middleware, model , utils, entre outras. O importante é manter um padrão lógico de organização do código, para que qualquer desenvolvedor saiba onde encontrar cada artefato do projeto.

Configuração das Dependências

Todo projeto Node.js possui um arquivo chamado package.json que configura as dependências do projeto. Para o nosso exemplo inicial, vamos precisar do Express, que irá nos ajudar a configurar o servidor, e do Nodemon, para facilitar o desenvolvimento evitando a reinicialização do servidor sempre que mudarmos um arquivo. O arquivo terá o seguinte conteúdo:

Feito isso, execute o comando abaixo para baixar as dependências:

$ npm installadded 266 packages from 167 contributors and audited 2357 packages in 19.03s
found 0 vulnerabilities

Configuração do Servidor

Para executar o servidor, vamos editar o arquivo server.js que irá apenas chamar o módulo app:

O require indica uma dependência com o conteúdo do arquivo app.js, dessa forma precisamos editá-lo:

Configuramos o Express para disponibilizar as rotas dos serviços configurados na porta 9999 e utilizar o corpo da requisição no formato JSON (módulo body-parser).

Definição das rotas

Essa é a etapa em que definimos as URLs dos serviços e o que fazer quando uma delas for requisitada. Vamos então começar criando um arquivo index.js na pasta routes:

💡Sempre que tivermos uma pasta importada como dependência usando o require, precisamos de um arquivo de entrada, que por padrão é um index.js.

A rota inicial é configurada por um objeto Router, que permite informar uma rota e quem irá responder por ela. No nosso exemplo, criamos uma rota /api que irá conter os serviços disponibilizados pela aplicação. Além disso, para testes, colocamos uma mensagem ‘Connected!’ caso o usuário faça uma requisição ao endereço http://localhost:9999 com o verbo GET.

Definição das APIs

No padrão REST, definimos APIs baseadas em recursos. Como nesse post estamos criando um serviço de cadastro de usuário, vamos utilizar o recurso usuario, pois ele será o objeto manipulado pelo serviço.

Para configurar o recurso usuario, vamos criar uma pasta api dentro da pasta routes, e adicionar o arquivo index.js para configurar a rota até o recurso:

Agora, vamos definir a rota para esse recurso criando uma pasta usuario dentro da pasta api. Dentro da pasta api, vamos adicionar um arquivo index.js que irá configurar as operações feitas pelo serviço:

Configuramos as URLs de acesso a cada funcionalidade do recurso usuário, usando os verbos HTTP adequados para cada operação CRUD (Criação, Remoção, Update, Delete). O :id representa o identificador do usuário que é informado na URL para obter, atualizar, e remover o mesmo. Cada URL configurada irá responder invocando o controlador adequado à operação.

💡 A separação da lógica do serviço do seu roteamento é uma boa prática, por isso nós utilizamos controladores vinculados às rotas, ao invés de implementar a lógica do serviço diretamente.

Configurando o banco de dados

Por questões de simplicidade, os dados dos usuário serão salvos num banco de dados de arquivo. Para isso, vamos criar uma pasta na raiz do projeto chamada data contendo um arquivo vazio chamado data.db:

Arquivo data.db

Para utilizar esse arquivo como banco de dados, vamos configurar o nedb criando uma pasta config contendo o arquivo database.js com o seguinte conteúdo:

Como iremos utilizar a dependência nedb, temos que adicioná-la ao projeto utilizando o seguinte comando:

$ npm install nedb --save

Pronto! O banco de dados está configurado e poderá ser utilizado pelos controllers.

Criando os Controllers

Agora sim vamos implementar a lógica dos serviços, que estará localizada nos controllers. Vamos então criar a pasta do recurso usuario dentro da pasta controllers para adicionar os arquivos de cada operação configurada nas rotas:

Controllers do recurso usuario.

Feito isso, vamos editar o nosso arquivo controllers/usuario/get.js para recuperar o usuário do banco de arquivo:

💡 Observe que é muito importante tratar cada código HTTP de retorno, para que o cliente do serviço saiba o que está sendo informado a respeito do recurso manipulado. Se quiser saber mais sobre cada código HTTP, acesse esse link.

O serviço irá retornar os usuários encontrados no arquivo data.db com o id informado na URL. Para testarmos efetivamente, precisamos criar o serviço de persistência de usuários. Para isso, vamos editar o arquivo controllers/usuario/create.js:

Finalmente, para iniciar o serviço, falta adicionar as operações update e delete:

Executando o serviço

Com o projeto salvo, vamos finalmente testar os serviços criados. Para isso, devemos rodar o comando abaixo:

$ npm start> nodemon server[nodemon] 1.19.0
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `node server.js`
Banco data.db pronto para uso
Server running on port 9999

Conforme configurado nos arquivos de rota, a url até o recurso usuário é http://localhost:9999/api/usuario. Você pode consumir o serviço para cada operação da seguinte forma:

  • Recupera o usuário: GET /api/usuario/:id
$ curl http://localhost:9999/api/usuario/8qSJB2sqsOmJzzDw -v
  • Cria um usuário: POST /api/usuario
$ curl -XPOST -H 'Content-Type: application/json' http://localhost:9999/api/usuario -d '{"nome":"Phoebe Buffay"}' -v
  • Atualiza um usuário: PUT /api/usuario/:id
$ curl -XPUT -H 'Content-Type: application/json' http://localhost:9999/api/usuario/fThc8EJZTHKpRKk  -d '{"nome":"Mônica Geller Bing"}' -v
  • Remove um usuário: DELETE /api/usuario/:id
$ curl -XDELETE http://localhost:9999/api/usuario/OrtFSthcSZ6jEnGh -v

Conclusão

Esse post demonstrou como construir um serviço REST utilizando o Node.js. Construímos um serviço simples, passo a passo, explicando o papel de cada componente na solução. Espero que agora você seja capaz de construir os seus próprios serviços REST com o Node.js, sem maiores dificuldades. E se tiver dúvidas, adicione um comentário!

Se você gosta do meu conteúdo, não deixe de conferir o meu canal do Youtube, onde falo sobre desenvolvimento de software. Espero te ver por lá! 😉

Referências

--

--

Giuliana Bezerra
Desenvolvimento com Node.js

Solution Architect — Online Instructor — Youtuber at @giulianabezerra — Writer