Pereira Caio Ribeiro - Node.js. Aplicacoes web real time com Node.js стр 15.

Шрифт
Фон

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

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке