app.get('/sair', home.logout);
};
Depois implementaremos suas respectivas actions no controller/home.js,
seguindo a convenção de nomes
login e logout, que foram utilizados no
routes/home.js. Na action login será implementada uma simples regra de vali-
dação dos campos nome e email vindos do formulário. Se os campos passarem na
validação, esses dados serão armazenados na sessão em req.session.usuario,
assim como criarmos um array vazio ( usuario['contatos'] = [];) de con-
tatos para no futuro utilizá-lo na gestão de contatos. Em seguida será feito um
redirecionamento para rota /contatos.
Na action logout é chamada a função:
req.session.destroy(), que irá limpar os dados da sessão e gerar uma nova.
module.exports = function(app) {
var Usuario = app.models.usuario;
var HomeController = {
index: function(req, res) {
res.render('home/index');
},
login: function(req, res) {
var email = req.body.usuario.email
, nome = req.body.usuario.nome;
if(email && nome) {
var usuario = req.body.usuario;
usuario['contatos'] = [];
req.session.usuario = usuario;
res.redirect('/contatos');
} else {
res.redirect('/');
}
},
logout: function(req, res) {
45
5.2. Controlando as sessões de usuários
Casa do Código
req.session.destroy();
res.redirect('/');
}
};
return HomeController;
};
Vamos testar essa implementação? Dê um restart no servidor. Para isso fina-
lize o servidor atual teclando no terminal CTRL+C (no Windows ou Linux) ou
Command+C (no MacOSX), em seguida execute node app.js e depois em seu
browser tente fazer um login no sistema.
Figura 5.1: Infelizmente deu mensagem de erro.
O que houve? Eu implementei tudo certo! Então, meu amigo, esse erro acon-
teceu porque faltou habilitar um novo item na stack de configurações. Esse item é
responsável por receber os dados do formulário html e fazer um parser para objeto
JSON, afinal ele não reconheceu o objeto req.body.usuario. Já adiantando, tam-
bém vamos incluir na stack um controle de sessão e cookies para que na próxima vez
tudo funcione corretamente. Abaixo segue em ordem correta os novos itens da stack
de configurações do nosso servidor:
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.cookieParser('ntalk'));
app.use(express.session());
app.use(express.json());
app.use(express.urlencoded());
app.use(express.static(__dirname + '/public'));
46
Casa do Código
Capítulo 5. Dominando o Express
É
necessário
incluir
o
express.cookieParser(),
pois
o
express.session() utiliza-o para codificar e ou decodificar o SessionID
que foi persistido no cookie.
Outra configurações habilitadas foram o
express.json() e
express.urlencoded(), que são responsáveis
por criar objetos JSON
vindos de um formulário HTML. Ele
cria um objeto através dos atributos name e value , existentes
nas tags <input>
, <select>
e <textarea>
. Ao submeter um
formulário com a tag: <input name="usuario[idade] value="23>
será
criado um objeto dentro de req.body
. Neste caso, será criado
req.body.usuario.idade
Alguns cuidados ao trabalhar com Sessions
Qualquer
nome
informado
para
o
req.session
será
armazenado
como
um
atributo
deste
objeto,
por
exemplo:
req.session.mensagem = "Olá".
Cuidado
para
não
so-
brescrever os nomes de suas funções nativas, como por exemplo:
req.session.destroy ou req.session.regenerate. Ao fazer
isso, você sobrescreve essas funções desabilitando suas respectivas
funcionalidades.
Com isso, no decorrer de sua aplicação possíveis
inesperados bugs acontecerão no sistema.
Para entender melhor as
funções da session, veja a documentação do Connect:
http://www.senchalabs.org/connect/session.html
Para finalizar,
antes de testarmos as modificações,
precisamos criar
um
controller
e
routes
para contatos.
Afinal temos a função
res.redirect('/contatos') e até agora não foi implementada nenhuma
lógica para realizar este redirecionamento.
A rota /contatos permite entrar em uma nova área do sistema, que será uma
das principais áreas que iremos explorar no decorrer deste livro. Por enquanto vamos
simplificar a implementação criando um controller, um rota e uma view para ele.
Crie o diretório contatos dentro de views e codifique o arquivo index.ejs
com o seguinte conteúdo:
<% include ../header %>
<header>
47
5.2. Controlando as sessões de usuários
Casa do Código
<h2>Ntalk - Agenda de contatos</h2>
</header>
<section>
<p>Bem-vindo <%- usuario.nome %></p>
</section>
<% include ../exit %>
<% include ../footer %>
Nesta view vamos renderizar o nome do usuário logado, para isso utilizamos
a função: <%- usuario.nome %>. Este objeto será enviado pelo controller que
implementaremos a seguir. Repare que desta vez reaproveitamos o header.ejs
e footer.ejs e isso tornou muito mais limpo esta view. Também incluímos um
novo partial - <% include ../exit %>. Basicamente, ele possui o link Sair, que simplesmente faz logout no sistema. Ele será reaproveitado por grande parte do