Skip to content

2. Aprendendo sobre Controllers

Ingo Guilherme Both Eyng edited this page Jun 6, 2018 · 4 revisions

Caso não tenha visto a primeira parte, peço que dê uma pequena pausa e dê uma olhada nela, já que vamos dar continuidade a partir daquele.

Projeto completo feito nesse tutorial para download.

Retorno de dados

Atualmente o nosso localhost:3000 retorna apenas a mensagem Hello World!, mas quando realizamos uma requisição ao servidor não esperamos apenas uma mensagem simples, e sim dados um tanto mais robustos, vamos fazer com que nossa rota retorne uma lista de tarefas ao invés de uma simples frase.

No arquivo routes/index.js remova o trecho:

routes/index.js

response.send('Hello world')

E adicione o seguinte código, ficando desta maneira:

routes/index.js

module.exports = function (app) {
	app.get('/', function (request, response) {
		response.json({
			data: [
				{_id: 1, title: 'Limpar a casa', status: 0, created_at: new Date()},
				{_id: 2, title: 'Lavar o carro', status: 0, created_at: new Date()}
			]
		});
	});
}

Pronto, agora ao invés de retornar uma simples frase a requisição retorna uma lista de tarefas em formato JSON.

Mas isto parece errado, por quê nossa rota deveria lidar com dados desta forma? Desta maneira ela quebra o princípio da responsabilidade única, pois está atribuindo mais de uma tarefa para a rota. E para isso que existem os Controllers

O princípio da responsabilidade única é um dos princípios SOLID, você pode saber mais sobre aqui

Controllers

Utilizando o padrão MVC (Model-View-Controller), os controllers são os responsáveis por manipular os dados entre a camada de modelos (Model) e o cliente (View), basicamente ele é responsável em enviar os dados do cliente ao model, realizando alterações no estado da aplicação.

Para começar, vamos criar uma nova pasta chamada controllers dentro do diretório raiz do nosso projeto, e dentro dela o arquivo controllers/task.js (Lembrando que estamos chamando esse controller de "tasks" porque ele será responsavel por manipular os dados da nossa lista de tarefas, mas em outros casos poderia ser qualquer coisa, como por exemplo "users" para manipular os dados de usuarios do sistema).

Windows

mkdir controllers
cd controllers
type nul > task.js

Linux

mkdir controllers
touch controllers/task.js

Em seguida cole o segunnte trecho de código dentro do arquivo controllers/task.js:

controllers/task.js

function index (request, response) {
	response.json({
		data: [
			{_id: 1, title: 'Limpar a casa', status: 0, created_at: new Date()},
			{_id: 2, title: 'Lavar o carro', status: 0, created_at: new Date()}
		]
	});
}

module.exports = {index}

Basicamente o que fizemos aqui foi criar a função index e exportamos ela através do module.exports. Mas agora precisamos corrigir nossa rota. O arquivo routes/index.js ficará assim:

routes/index.js

var task = require('../controllers/task');

module.exports = function (app) {
	app.get('/', task.index);
}

Caso haja a possibilidade de outro controller usar o mesmo arquivo de rota, teremos então que importar ele para este outro controller, mas como estamos usando o Consing (veja a primeira parte onde explicamos sobre o Consign), podemos apenas dar um autoload nos controllers em nosso arquivo bootstrap/app.js também, ficando assim:

bootstrap/app.js

var logger = require('morgan');
var express = require('express');
var consign = require('consign');

var app = express();

app.use(logger('dev'));

//Adicionando a pasta "controllers" ao Consign
consign()
	.include('controllers')
	.then('routes')
	.into(app);

module.exports = app;

var port = process.env.PORT || 3000;

app.listen(port, function () {
    console.log('Servidor rodando em http://localhost:%s', port);
});

Sendo assim não é mais necessário o require no arquivo routes/index.js, já que demos um autoload nos controllers. Ficando assim:

routes/index.js

module.exports = function (app) {
	app.get('/', app.controllers.task.index)
}

Você pode testar o que fizemos apenas abrindo localhost:3000 que o GET é feito automaticamente e o JSON é retornado na sua tela do navegador, mas uma maneira legal de testar, GETs e posteriormente POSTs e afins, é utilizar o Postman.

É uma poderosa plataforma GUI para tornar seu desenvolvimento de API mais rápido e fácil, desde a criação de solicitações da API, através de testes, documentação e compartilhamento. Com ele você poderá então testar e até mesmo criar métodos GET, POST, PUT, DELETE, etc, em várias linguagens, inclusive NodeJS.

Projeto completo feito nesse tutorial para download.