REST API em Node.js e RethinkDB - fga-eps-mds/A-Disciplina-MDS-EPS GitHub Wiki

Histórico de Revisão

Data Versão Descrição Revisor
26/05/2017 1.0 Estrutura de tópicos Vitor Borges
29/05/2017 1.1 Escrita dos tópicos Vitor Borges e Thiago Moreira
30/05/2017 1.2 Revisão dos tópicos Danilo Barros e Lucas Rufino
30/05/2017 1.3 Validação dos tópicos e refatoração final Danilo Barros, Lucas Rufino, Thiago Moreira e Vitor Borges
30/05/2017 1.4 Configuração final do RethinkDB Danilo Barros, Lucas Rufino, Thiago Moreira e Vitor Borges

[TOC]

1. Introdução

2. Tecnologias

2.1. Node JS

2.2. RethinkDB

  • Aplicações mobile e web colaborativas;
  • Jogos multiplayer;
  • Mercados em tempo real;
  • Dispositivos conectados.

3. Instalação

3.1. Instalando o Node JS

Para a instalação da mais nova versão do Node utilize os seguintes comandos:

    $ curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash -
    $ sudo apt-get install -y nodejs

Opcionalmente, installe o build-essencial para utilizar addons nativos do npm:

    $ sudo apt-get install -y build-essential

Com a instalação concluída, cheque se o npm e o Node foram instalados corretamente.

    $ node --version
    v7.10.0
    $ npm --version
    4.5.0

3.2. Instalando o RethinkDB

    $ source /etc/lsb-release && echo "deb http://download.rethinkdb.com/apt $DISTRIB_CODENAME main" | sudo tee /etc/apt/sources.list.d/rethinkdb.list
    $ wget -qO- https://download.rethinkdb.com/apt/pubkey.gpg | sudo apt-key add -
    $ sudo apt-get update
    $ sudo apt-get install rethinkdb

Para verificar a correnta instalação do RethinkDB execute:

    $ rethinkdb -v
    rethinkdb 2.3.5~0trusty (GCC 4.8.2)

4. Configuração

    $ mkdir myAPI
    $ cd myAPI

Na pasta da aplicação, inicie um projeto Node.js com o comando npm e as configurações desejadas.

     myApp-$ npm init

Após isso, deve-se inserir as informações referentes ao seu servidor. Ele pede o nome, versão, descrição, entry point, test command, git repository, palavras-chaves, autor e licença. No fim, ele pergunta se está tudo ok para criar o projeto. Se sim, digite yes no terminal.

Com isso, será criado um arquivo chamado package.json que é o coração da aplicação Node.js, pois nele definimos todas as dependências da API.

4.1. Configurando o Node JS

Após a criação do projeto, é recomendado instalar algumas depêndencias que melhoram a experiência da utilização do Node, facilitando em diversos aspectos, como por exemplo, simplificar a utilização de querys para requisições no banco.

As dependências recomendadas são:

Express: Poderoso gerenciador de rotas focado em alta performance, que simplifica requisições HTTP.

    $ npm install express --save

Body-parser: Facilita a captura dos objetos que são passados ou recebidos na sua requisição HTTP.

    $ npm install body-parser --save

Morgan: Gera logs de requisição para melhor acompanhamento das rotas.

    $ npm install morgan --save

Nodemon: Recarrega automaticamente o seu servidor, poupando o trabalho de reiniciá-lo sempre que houver alguma modificação.

    $ npm install nodemon --save

O comando --save presente nestes comandos citados acima salva todas as dependências instaladas no package.json, facilitando o compartilhamento do código posteriormente. Para um terceiro instalar essas dependências do projeto, basta digitar o comando:

    $ npm install

4.1.1 Criando um servidor

Após os passos acima, você já é capaz de criar sua API. Mas para isso, é necessário criar o servidor para iniciar os procedimentos.

Devemos criar um arquivo na pasta raiz para rodar nossa aplicação. Neste exemplo usaremos o nome app.js.

Inicialmente, é preciso importar as depêndencias que serão necessárias para rodar o servidor. A importação é feita com o método require do Node.

    var express = require('express')
    var bodyParser = require('body-parser')
    var morgan = require('morgan')

Após isso, devemos evocar a função para utilizar os objetos do express em si.

    var app = express()

No fim, devemos subir o servidor utilizando nossa variável app. Para isso, passamos a porta que o servidor vai escutar e uma função que vai ser chamada assim que o servidor estiver no ar, como é mostrada no código abaixo.

    app.listen(3000, function() {
        console.log('Servidor executando no endereço http://localhost:' + 3000)
    })

Após isso, seu servidor estará pronto para ser utilizado.

Utilize o comando abaixo para rodar o seu servidor.

    $ node app

4.2. Configurando o RethinkDB

Uma tecnologia auxiliar ao RethinkDB que nos permite criar models e facilita nas queries é o Thinky, o qual utilizamos para configurar a base de dados. Para instalar o Thinky, faça:

    myAPI-$ npm install --save thinky

Com isso, crie uma pasta com o nome database e configure o arquivo de banco de dados chamado index.js.

    //Path: myAPI/database/

    var thinky = require('thinky')()
    var { type, r } = thinky // importa 'type' para tipos de variáveis e 'r' como o próprio módulo do RethinkDB

    async function init () {
        try {
            await thinky.dbReady()
            return thinky
        } catch (error) {
            throw error
        }
    }
    export { init, thinky, type, r }

Com a base de dados configurada, volte ao arquivo app.js e adicione as linhas de configuração do banco de dados:

    var express = require('express')
    var bodyParser = require('body-parser')
    var db = require('./database')
    var morgan = require('morgan')

    var app = express()

    app.use(bodyParser.json({
      limit: '5mb'
    }))

    db.init()
      .then(db => {
        app.listen(3000, () => {
          console.log('Server listening on http://localhost:3000')
        })
      })

O próximo passo é criar uma model para poder salvar no banco de dados. Para isso, crie uma pasta models.

    myAPI-$ mkdir models

Agora, crie uma model qualquer de teste, no caso, criaremos uma model User.js.

    var { thinky, type } = require('../database')
    
    var User = thinky.createModel('Users', {
        name: type.string(),
        email: type.string()
    })
    
    export default User

Agora, basta criar uma api e configura-la para disponibilizar os métodos de requisição e consumir a API REST. Para isso, crie a pasta api e o arquivo index.js.

    myAPI-$ mkdir api
    myAPI-$ touch api/index.js
    myAPI-$ touch api/users.js
    // index.js
    var { Router } = require('express')
    var userRouter = require('./users')
    
    export default ({ db }) => {
        let api = Router()
        
        var users = userRouter({ db })
        api.use('/users', users)
        
        return api
    }

Crie também o arquivo users.js na pasta api.

    // users.js
    var { Router } = require('express')
    var User = require('../models/User')
    
    export default ({ db }) => {
        let router = Router()
        /* 
           configuração para rotas do tipo users/:id para 
           utilizarem o id do User como parâmetro
        */
        router.param('user', (req, resp, next, id) => {
            req.userDocument = User.get(id)
            next()
        })
        
        router.get('/', async (request, response) => {
            try {
                var result = await User.run() // executa a query de get all no bando de dados
                response.json(result)
            } catch (error) {
                response.status(500).send(error)
            }
        })
        
        return router
    }
    

Agora, volte no arquivo app.js e configure a rota para /api.

    var api = require('./api') // importe a pasta 'api'
    
    [...]
    
    db.init()
      .then(db => {
        app.use('/api', api({ db })) // configure as rotas para começarem com '/api'
        app.listen(3000, () => {
          console.log('Server listening on http://localhost:3000')
        })
      })

Agora, para executar a api basta executar os comandos rethinkdb e nodemon app.js na pasta myAPI e acessar a rota http://localhost:3000/api/users para acessar a rota e verificar a resposta do servidor.

Repare que não existe nenhum usuário cadastrado. Para inserir um usuário de teste, acesse o http://localhost:8080 para acessar o RethinkDB, como a imagem a seguir:

RethinkDB

Agora, acesse o Data Explorer e crie um usuário default:

Default user

Agora, ao acessar novamente a rota de /api/users na API você verá a resposta do servidor com o usuário cadastrado.

Server response

Pronto. Você já pode criar sua própria RESTfull API com Node.js e RethinkDB!

5. Bibliografia