Assim como Rails, Sinatra ou Geddy, no Express também é possível criar Helpers que visam facilitar a construção das views dinâmicas em uma aplicação web.

O objetivo desse post é apresentar as diferenças e como construir Helpers e Dynamic Helpers no web framework Express do Node.js.

O que são helpers?

São funcionalidades que criamos no servidor, com intuito de disponibilizarmos facilmente funções já com resultados renderizáveis nas views do sistema, ao invés de realizarmos toda regra de negócio na própria view. O grande motivo de fazer isso, é que um helper pode ser reutilizável em outras views, facilitando muito a manutenção do código.

Muitas vezes são pequenas funções que visam mostrar trechos de códigos html construídos dinâmicamente no servidor, sendo apenas implementado em uma view pronta para apresentação. Esse conceito de Helpers surgiu com a popularização do Ruby On Rails e desde então muitos web frameworks passaram a implementar esse conceito.

No Express existe dois tipos de Helpers: Helpers e Dynamic Helpers.

A grande diferença é que Helpers são funções que recebem qualquer parâmetro na função, já os Dynamics Helpers recebem por padrão os parâmetros Request e Response da aplicação, sem a necessidade de incluí-los explicitamente ao utilizarem nas views e com isso é possível trabalhar com diversos atributos desses objetos, como por exemplo, trabalhar com Session que são encontradas na Request, ou seja, com isso é possível criar uma função que valida se o usuário esta logado no sistema verificando se há dados dele armazenados na Session.

Para finalizar veja abaixo uma mini-aplicação utilizando Express, Helpers e Jade:

var express = require('express')
  , app = module.exports = express.createServer();

// Configurações necessárias para habilitar Helpers e Dynamic Helpers.
app.configure(function(){
  // Neste exemplo estou usando o Template Engine Jade, porém o mesmo conceito funciona em qualquer template engine.
  app.set('views', __dirname + '/../views');
  app.set('view engine', 'jade');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser());
  app.use(express.session({secret: 'secretkey'}));
  app.use(express.static(__dirname + '/public'));
});

// funções utilizando DynamicHelpers
app.dynamicHelpers({
  usuarioDaSession: function(req, res){
    return req.session.usuario;
  },
  estaLogado: function(req, res){
    return (req.session == req.session.usuario) ? true : false;
  }
});
// Funções utilizando Helpers
app.helpers({
  listaDeUsuarios: function(usuarios){
    var list = "<ul>";
    for(var usuario in usuarios){
      list += "<li>" + usuario.nome + "</li>";
    }
    list += "</ul>";
    return list;
  }
});

// Adicionando uma rota
app.get('/', function(req, res){
  var usuarios = [{nome: 'João'},{nome: 'Maria'},{nome: 'Carla'}];
  // Enviando para view um array com usuarios, que serão renderizados através do helper ListaDeUsuarios.
  res.render('index', {usuarios: usuarios});
});

app.listen(8000);

Agora segue a página de exemplo utilizando Jade, lembrando que tenho um post que fala melhor sobre o Jade, caso não conheça-o.

// index.jade
!!! 5
html
  head
    title Lista de usuários
  body
    if(estaLogado)
      h3 Bem-vindo #{usuarioDaSession.nome}
    h1 Lista de usuários
    #{listaDeUsuarios(usuarios)}

É isso ae pessoal, com esse exemplo já será possível criar uma aplicação mais organizada, separando regras de negócio que geralmente são feitas nas views para um helper pelo qual é uma boa prática fazer isso, pois um helper pode ser reutilizado em outros locais da aplicação, simplificando a manutenção do projeto. Valeu turminha! Até a próxima!!