});
Rode
novamente e faça o teste acessando a url http://localhost:3000/bemvindo , e
também acessando uma outra, diferente desta. Viu o resultado?
Reparem na complexidade do nosso código: o roteamento foi tratado através dos
comandos if e else, e a leitura de url é obtida através da função request.url() que retorna uma string sobre o que foi digitado na barra de endereço do browser. Esses
endereços utilizam padrões para capturar valores na url. Esses padrões são: query
strings ( ?nome=joao) e path ( /admin). Em um projeto maior, tratar todas as urls
dessa maneira seria trabalhoso e confuso demais. No Node.js, existe o módulo nativo
chamado url, que é responsável por fazer parser e formatação de urls. Acompanhe
como capturamos valores de uma query string no exemplo abaixo. Aproveite e crie
o novo arquivo url_server.js:
var http = require('http');
var url = require('url');
var server = http.createServer(function(request, response){
response.writeHead(200, {"Content-Type": "text/html"});
response.write("<h1>Dados da query string</h1>");
var result = url.parse(request.url, true);
16
Casa do Código
Capítulo 2. Desenvolvendo aplicações web
for(var key in result.query){
response.write("<h2>"+key+" : "+result.query[key]+"</h2>");
}
response.end();
});
server.listen(3000, function(){
console.log('Servidor http.');
});
Neste exemplo, a função url.parse(request.url, true) fez um parser da url obtida pela requisição do cliente (request.url).
Esse módulo identifica através do retorno da função url.parser() os seguintes
atributos:
href:
Retorna a url completa:
http://user:pass@host.com:8080/p/a/t/h?
query=string#hash
protocol: Retorna o protocolo: http
host: Retorna o domínio com a porta: host.com:8080
auth: Retorna dados de autenticação: user:pass
hostname: Retorna o domínio: host.com
port: Retorna a porta: 8080
pathname: Retorna os pathnames da url: /p/a/t/h
search: Retorna uma query string: ?query=string
path:
Retorna
a
concatenação
de
pathname
com
query
string:
/p/a/t/h?query=string
query: Retorna uma query string em JSON: {query:string}
hash: Retorna ancora da url: #hash
Resumindo, o módulo url permite organizar todas as urls da aplicação.
17
2.4. Separando o HTML do Javascript
Casa do Código
2.4
Separando o HTML do Javascript
Agora precisamos organizar os códigos HTML, e uma boa prática é separá-los do
Javascript, fazendo com que a aplicação renderize código HTML quando o usuário
solicitar uma determinada rota. Para isso, utilizaremos outro módulo nativo FS (File System). Ele é responsável por manipular arquivos e diretórios do sistema operacional. O mais interessante desse módulo é que ele possui diversas funções de mani-
pulação tanto de forma assíncrona como de forma síncrona. Por padrão, as funções
nomeadas com o final Sync() são para tratamento síncrono. No exemplo abaixo,
apresento as duas maneiras de ler um arquivo utilizando File System:
var fs = require('fs');
fs.readFile('/index.html', function(erro, arquivo){
if (erro) throw erro;
console.log(arquivo);
});
var arquivo = fs.readFileSync('/index.html');
console.log(arquivo);
Diversos módulos do Node.js possuem funções com versões assíncronas e sín-
cronas. O fs.readFile() faz uma leitura assíncrona do arquivo index.html.
Depois que o arquivo foi carregado, é invocado uma função callback para fazer os tra-
tamentos finais, seja de erro ou de retorno do arquivo. Já o fs.readFileSync()
realizou uma leitura síncrona, bloqueando a aplicação até terminar sua leitura e re-
tornar o arquivo.
Limitações do File System nos sistemas operacionais
Um detalhe importante sobre o módulo File System é que ele não é
100% consistente entre os sistemas operacionais. Algumas funções são
específicas para sistemas Linux, OS X, Unix e outras são apenas para Win-
dows.
Para melhores informações leia sua documentação: http://nodejs.
org/api/fs.html
Voltando ao desenvolvimento da nossa aplicação, utilizaremos a função
fs.readFile() para renderizar html de forma assíncrona. Crie um novo arquivo,
chamado site_pessoal.js, com o seguinte código:
18
Casa do Código
Capítulo 2. Desenvolvendo aplicações web
var http = require('http');
var fs = require('fs');
var server = http.createServer(function(request, response){
// A constante __dirname retorna o diretório raiz da aplicação.
fs.readFile(__dirname + '/index.html', function(err, html){
response.writeHeader(200, {'Content-Type': 'text/html'});
response.write(html);
response.end();
});
});
server.listen(3000, function(){
console.log('Executando Site Pessoal');
});
Para que isso funcione, você precisa do arquivo index.html dentro do mesmo
diretório. Segue um exemplo de hello que pode ser utilizado:
<!DOCTYPE html>
<html>
<head>
<title>Olá este é o meu site pessoal!</title>
</head>
<body>
<h1>Bem vindo ao meu site pessoal</h1>
</body>
</html>
Rode o node site_pessoal.js e acesse novamente http://localhost:3000 .
2.5
Desafio: Implementar um roteador de url