Neste artigo, eu escrevo sobre como começar a construir API Restful usando NodeJS. Explico o uso do Express e como retornar dados do sqlite3.

O que é uma API RESTful?

API é um acrônimo para Application Programming Interface, que se tornou parte integrante do desenvolvimento de software. “É um conjunto de métodos de comunicação claramente definidos entre vários componentes” - Wikipedia.

As APIs RESTFul, por outro lado, são APIs que estão em conformidade com o estilo de arquitetura REST. REST refere-se a Transferência de Estado Representacional (Representational State Transfer) que é uma arquitetura que define um conjunto de restrições e propriedades baseado em HTTP.

A implementação mais comum do serviço da Web RESTFul é a API JSON. JSON é simplesmente Javascript Object Notation.

NodeJs

NodeJs é uma linguagem de programação server-side que pode ser usada para desenvolver APIs e aplicativos web. Ele usa JavaScript e roda no Chrome V8 engine.

Para criar a API, comece criando um arquivo package.json. Este é o arquivo de configuração para aplicativos NodeJs que mantém as bibliotecas usadas, os metadados do aplicativo e etc.

Setup inicial

Em um diretório vazio, abra um terminal ou um prompt de comando e digite:

npm init

Este comando iniciará uma série de perguntas tais como como o nome do arquivo js, o pacote, versão, descrição, comandos de teste e assim por diante. Após respondidas, o arquivo package.json será criado.

Agora, vamos criar um novo arquivo chamado app.js, que contém o script da API e é executado quando o NodeJs é executado. Certifique-se de que a propriedade "main" no package.json tenha o valor "app.js", que é o nome do arquivo de script que criamos agora.

Em seguida, vamos instalar ExpressJs. ExpressJs é um framework que ajuda a construir APIs e WebApps no NodeJS. Ele oferece uma biblioteca e utilitários para roteamento (routes), manipulação de Request/Response, Middlewares e assim por diante.

Para instalar o Express, execute o comando abaixo no mesmo terminal ou prompt de comando que usamos antes.

npm install express --save

O comando acima instala o framework express como um módulo dentro do aplicativo.

Em seguida, instalaremos outra biblioteca chamada "body-parser", que nos ajuda a acessar o corpo do Request de forma mais simples.

npm install body-parser --save

No NodeJS, todas as bibliotecas são instaladas e adicionadas a pasta node_modules e um mapeamento é adicionado na propriedade "dependencies" do arquivo package.json. O pacote.json mapeia as bibliotecas referenciadas no projeto utilizando a propriedade "dependencies".

De volta ao app.js, vamos importar as bibliotecas que usaremos em nossa aplicação.

const express = require("express");
const bodyParser = require("body-parser");
const port = 3000;

const, var e let

Por que declarar variáveis usando const, ao invés de var ou let? A ideia por detrás disso é simplicidade.

Um identificador (variável ou constante) deve ser usado ou representar um único conceito apenas.

Às vezes, é tentador utilizar o mesmo identificador para representar algum tipo de dado e logo em seguida representar outro tipo. Por exemplo, você pode estar realizando a leitura de uma query string e na mesma variável armazenar inicialmente a url inteira para a seguir armazenar algum valor da query string. Essa prática deve ser evitada.

Mas, então, porque eu uso const, ao invés de let ou var? Const não permite que outros valores sejam atribuídos ao mesmo identificar uma vez que ele já foi iniciado. O let deve ser usado quando o identificador precisa ser alterado. Os casos de usos para let são loops e algoritmos matemáticos.

Leitura sugerida: JavaScript ES6+: var, let, or const? | by Eric Elliott | JavaScript Scene | Medium

ExpressJs

Em seguida, vamos criar uma aplicação express a qual contém as rotas e handlers:

// Cria uma nova aplicação Express
const app = express();
 
// Transforma o objeto request em json
app.use(bodyParser.json());

Finalmente, nós configuramos o express para escutar na porta 3000 os requests e gerar as responses.

app.listen(port, () => {
  console.log("Servidor está escutando na porta " + port);
});

Para rodar a aplicação, execute o seguinte comando:

node app

Este comando inicia o servidor Node e roda a aplicação Express. Nós podemos ver o seguinte no terminal:

Servidor está escutando na porta 3000

Endpoints

O próximo passo é adicionar endpoints na aplicação, através dos quais a aplicação recebe requests e retorna responses.

Os endpoints são configurados para rodar sob rotas (routes). As rotas podem ser configuradas para receber parâmetros e tipos de métodos que elas aceitam, tais como GET, POST, PATCH, PUT e DELETE. Esses métodos representam a operação que os endpoints realizarão.

Para criar endpoints com o Express, basta utilizar um dos seguintes métodos que ele disponibiliza de acordo com os verbos HTTP:

  • app.post()
  • app.patch()
  • app.delete()
  • app.put()

Todos esses métodos esperam 2 parâmetros. A rota, e uma função callback.

Por exemplo:

app.get("/helloworld", (request, response) => {
  response.json({ message: "hello world" });
});

response.json é um método que envia um JSON como resposta.

Mais em Express 5.x - API Reference (expressjs.com).

SQLite

SQLite é um banco de dados relacional, leve e fácil de configurar e usar. Além disso, esse banco de dados é portável. Todo o seu schema e dados são armazenados em um único arquivo local.

Este banco de dados não é adequado para acesso simultâneo por múltiplos usuários. Como os dados são armazenados em um arquivo, precisamos cuidar também da segurança do mesmo.

Baixar o SQLite e criar um banco de dados de exemplo:

Para instalar o SQLite, execute o comando abaixo no terminal ou prompt de comando.

npm install sqlite3

Agora, no app.js, importe o SQLite.

const sqlite3 = require("sqlite3");

Este módulo possui métodos que nos ajudarão a nos comunicarmos com o sqlite3 do Nodejs.

Para conectar-se ao banco de dados, só precisamos passar o caminho do banco de dados.

var db = new sqlite3.Database(
  "./db/SampleDb.db",
  sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE,
  function () {
    console.log("Db opened");
  }
);

A seguir, vamos retornar os resultados de uma consulta simples. O sqlite3 possui vários métodos para manipular e retornar dados - todos documentados em API · mapbox/node-sqlite3 Wiki (github.com). Nós utilizaremos o método all:

app.get("/departments", (request, response) => {
  sql = "SELECT * FROM Departments";
  db.all(sql, function (err, rows) {
    if (rows) {
      var result = JSON.stringify(rows);
      response.status(200).json({ result });
    }
    if (err) {
      response.status(500).json({ err });
    }
  });
});

Finalmente, rode a aplicação executando no terminal node app e acesse a url localhost:3000/departments.

Créditos

Photo by ThisIsEngineering from Pexels