Controllers - NodeJS e Express (parte 3)

Posted by uselessdev on 15/01/2017

Índice

Retornando dados

Atualmente, quando acessamos nossa rota principal http://localhost:3000/ recebemos apenas uma mensagem:

Hello World

Mas não é isso que esperamos, nós esperamos receber uma lista com nossas tarefas, então vamos fazer isso, no arquivo routes/index.js remova o response.send('Hello world') e adicione o seguinte:

1
2
3
4
5
6
response.json({
data: [
{_id: 1, title: 'Titulo da tarefa', status: 0, created_at: new Date()},
{_id: 2, title: 'Titulo da tarefa', status: 0, created_at: new Date()}
]
})

Aqui nós já temos nossas tarefas retornando na lista, em formato JSON é claro mas depois explicarei porque fazer dessa forma.

Voltando aos nossos dados, fazendo dessa forma estamos quebrando o Principio de responsabilidade única atribuindo mais de uma tarefa pra nossa rota, então pra isso falaremos de Controllers

Controllers

Seguindo o MVC, os controllers são responsáveis por lidar com os dados entre o Model e o Cliente Views, em outras palavras seria ele o responsável em enviar dados do cliente ao Model pra alterar o estado da aplicação, enfim vamos criar então nosso controller de tarefas.

1
mkdir controllers; touch controllers/tasks.js

Vamos preparar nosso controller:

1
2
3
4
5
6
7
8
9
10
function index (request, response) {
response.json({
data: [
{_id: 1, title: 'Titulo da tarefa', status: 0, created_at: new Date()},
{_id: 2, title: 'Titulo da tarefa', status: 0, created_at: new Date()}
]
})
}
module.exports = {index}

Aqui nós criamos a função index e exportamos ela com o module.exports como você pode notar, o nosso objeto não recebe uma chave : valor apenas chave, isso porque a nossa chave é o mesmo nome do nosso valor, então isso é o mesmo que: module.exports = {index: index}, existem outras formas de exportar nossos dados, mas por enquanto, vamos focar nesse mesmo.

Agora precisamos configurar nossa rota routes/index.js

1
2
3
4
var tasks = require('../controllers/tasks')
module.exports = function (app) {
app.get('/', tasks.index)
}

Viu, bem mais simples né?! Porém se tivermos outro controller que vai usar o mesmo arquivo de rota (o que provavelmente nunca vai acontecer) teremos que importar ele também, então não precisamos fazer dessa forma, nós estamos usando consign então vamos dar um autoload em nossos controllers também bootstrap/app.js

1
2
3
4
consign()
.include('controllers')
.then('routes')
.into(app)

Uma vez feito isso, voltamos no nosso arquivo da rota routes/index.js e removemos aquele require do controller e deixamos assim:

1
2
3
module.exports = function (app) {
app.get('/', app.controllers.tasks.index)
}

Views?

Por enquanto nós não iremos, aplicar nenhuma view, vamos apenas lidar com JSON e requisições, assim você não precisa abrir seu navegador pra realizar seus testes, você pode usar o Postman ou outro muito bom, o Insomnia ou o próprio terminal usando CURL, por exemplo atualmente como temos apenas uma rota um requisição simples seria isso com CURL:

1
curl http://localhost:3000 -v

Esse é um comando simples de GET usando CURL o argumento, o argumento -v significa que queremos que a saída do nosso comando seja algo mais verboso.

Próximo: Models - NodeJS e Express - Criando uma aplicação simples (parte 4)


Comentários: