quinta-feira, 10 de outubro de 2013

REST - Aula Prática - Node.JS e MongoDB

Nesta segunda parte da aplicação REST, entenderemos o que vem a ser o Node.JS e como inserir dados no banco MongoDB. A IBM publicou um dos melhores e dos mais esclarecedores artigos sobre o que exatamente é o Node.js?. Resumidamente, o Node é uma plataforma de software que liberta JavaScript do navegador e permite que seja usado como uma plataforma de desenvolvimento de software em aplicações Server-Side. Executa sobre um motor ultra-rápido do Chrome, V8, e acrescenta em uma biblioteca rápida e robusta de módulos de I/O de rede assíncrona. Tendo como foco principal a construção de alto desempenho, um servidor altamente escalável e aplicativos cliente para o "Real Time Web". Uau. Aposto que pelo menos ficou curioso, então vamos brincar.

Criando a Aplicação com Express

No site oficial do Node.js baixe e instale o servidor. Vamos brincar em um esquema um pouco diferente de um simples 'Hello World', abra uma janela de comandos e instale o Express:

npm install -g express@2.5.8

Para manter uma organização, criaremos uma pasta para hospedar os projetos, por exemplo C:\rest. Dentro desta digite o seguinte comando para criar nosso projeto:

express notas

Finalize a configuração com:

cd notas
npm install

Então, temos nosso primeiro projeto em C:\rest\notas. Vamos baixar os drivers para acessarmos nosso banco, para tanto altere o arquivo package.json, da seguinte forma:

{
  "name": "Notas", 
  "version": "0.0.1",
  "private": true,
  "dependencies": {
    "express": "2.5.8",
    "jade": ">= 0.0.1",
    "mongoose": "2.6.5"
  }
}

Adicionamos uma dependência ao Mongoose (que é o driver para o MongoDB), instale através do seguinte comando:

npm install

Estamos com o esqueleto da aplicação totalmente montada. O Express funciona quase como o 'Maven', só que ao invés de Java utiliza uma dependência de pacotes com JavaScript e JSON. Editamos o arquivo app.js na raiz do projeto e adicionamos as seguintes linhas:

var express = require('express'),
  routes = require('./routes'),
  fs = require('fs'),
  NotaModel = require('./models/NotaModel.js');

...

app.configure('production', function(){
  app.use(express.errorHandler());
});

app.get('/form', function(req, res) {
  fs.readFile('./form.html', function(error, content) {
    if (error) {
      res.writeHead(500);
      res.end();
    } else {
      res.writeHead(200, { 'Content-Type': 'text/html' });
      res.end(content, 'utf-8');
    }
  });
});

app.post('/gravar', function(req, res) {
  var titulo = req.body.titulo;
  var descricao = req.body.descricao;
  NotaModel.gravarNota(titulo, descricao, function(err, user) {
    if (err) throw err;
      res.redirect('/form');
  });
});
...

Criamos duas chamadas: "/form" e "/gravar". A primeira traz um formulário HTML enquanto que a segunda recebe os dados deste formulário e grava no banco. Criamos, nesta mesma pasta (que é a raiz do nosso projeto), um arquivo chamado form.html com a seguinte codificação:

<h1>Minhas Notas</h1>
<form action="/gravar" method="post">
  <div>
    <label>Título:</label>
    <input type="text" name="titulo"/><br/>
  </div><div>
    <label>Descrição:</label>
    <textarea row="3" col="60" name="descricao"></textarea>
  </div><div>
    <input type="submit" value="Gravar Nota"/>
  </div>
</form>

Este formulário recebe os dados e quando submetido executa a chamada a ação "/gravar". No meu site publiquei um documento chamado MongoDB com Java, recomendo que baixe e leia para ter melhores referências sobre este banco.

Na camada com o MongoDB

O próximo passo é criar um arquivo de configuração para acessar o MongoDB. Na raiz do projeto criamos uma pasta chamada \lib, nesta um arquivo chamado db.js com a seguinte codificação:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
module.exports.mongoose = mongoose;
module.exports.Schema = Schema;
connect();

function connect() {
  var url = 'mongodb://localhost:27017/notas';
  mongoose.connect(url);
}
function disconnect() {
  mongoose.disconnect()
}

Temos dois métodos neste script, um para conectar e outro para desconectar o banco. Na url de conexão passamos o endereço do servidor, a porta e o nome da base de dados (que se não existe, será criada). Próximo passo é criarmos a tabela (que no MongoDB é chamado de Coleção). Na raiz do projeto criamos uma pasta chamada \models, nesta um arquivo chamado NotaModel.js com a seguinte codificação:

var db = require('../lib/db');

var NotaSchema = new db.Schema({
  titulo: {type: String, unique: true},
  descricao: String
})

var MinhaNota = db.mongoose.model('Nota', NotaSchema);

module.exports.gravarNota = gravarNota;

function gravarNota(titulo, descricao, callback) {
  var instance = new MinhaNota();
  instance.titulo = titulo;
  instance.descricao = descricao;
  instance.save(function (err) {
    if (err) {
      callback(err);
    } else {
      callback(null, instance);
    }
  });
}

Executar a aplicação

Inicie o servidor do MongoDB (veja no PDF disponibilizado como proceder) e o servidor do Node.JS com o seguinte comando:

node app.js

Acesse o endereço http://localhost:3000/form para testar a aplicação e cadastre algumas notas. Em seguida acesse o servidor do MongoDB e digite os seguintes comandos:

show dbs [e verifique que existe uma base chamada notas]
use notas
show collections [e verifique que existe uma coleção chamada notas]
db.notas.find() [e observe os dados que foram digitados]

Então é isso, agora podemos nos divertir persistindo dados no MongoDB através de um servidor puramente JavaScript.

Obrigado e até a próxima
Fernando Anselmo

2 comentários:

  1. Olá, boa tarde.
    Esta é a primeira vez q tento utilizar node e mongo, estou com uma duvida a respeito do banco Mongo, instalei o mongo utilizando o prompt, então quando inicializo o servidor node com o comando: node app.js, estou inicializando o banco de dados tambem?
    Pois quando acesso o localhost:3000\form e tento cadastrar uma nota o navegador fica carregando muito tempo.
    Bom aguardo retorno, agradeço pelo post e até mais.
    Abrçs.

    ResponderExcluir
  2. Deco, boa tarde.

    Não, o Mongo funciona de forma independente ao Node, ou seja, você deve primeiro inicializar o banco depois o Node.

    [ ] ´s
    Fernando Anselmo

    ResponderExcluir