Escolar Documentos
Profissional Documentos
Cultura Documentos
Express.js
Problema
Programar utilizando apenas a API (Application Programming Interface) HTTP nativa é muito trabalhoso!
Solução
Expressjs - http://expressjs.com.
Características
MVR (Model-View-Routes)
MVC (Model-View-Controller)
Roteamento de URLs via callbacks
Middleware
Interface RESTFul
Suporte a File Uploads
Configuração baseado em variáveis de ambiente
Suporte a helpers dinâmicos
Integração com Template Engines
Integração com SQL e NoSQL
Instalação
npm install -g express
npm install -g express-generator
Ajuda
express -h
Configuradando
express NOME_PROJETO --ejs
cd NOME_PROJETO
npm install
estrutura de diretórios
package.json: contém as principais informações sobre a aplicação, como nome, autor, versão, colaboradores, URL,
dependências e muito mais
public: pasta pública que armazena conteúdo estático, por exemplo, imagens, CSS, JavaScript etc.
app.js: arquivo que inicializa o servidor do projeto, através do comando node app.js
routes: diretório que mantém todas as rotas da aplicação
views: diretório que contém todas as views que são renderizadas pelas rotas
bin: diretório com um arquivo que permite iniciar a aplicação via linha de comando
atualize package.json
remover módulos que não serão utilizados: morgan, debug e static-favicon,
npm remove debug static-favicon morgan --save
dependências:
"dependencies": {
"express": "> 4.2.0",
"cookie-parser": "> 1.0.1",
"body-parser": "> 1.0.0",
"ejs": "> 0.8.5"
}
app.use(express.static(path.join(__dirname, "public")));
Middlewares
#3 app.set(chave, valor) - map com configurações do servidor, por exemplo, middlewares.
middleware 1: template engine EJS #3
middleware 2: servidor de arquivos estáticos
Rotas
Duas rotas foram configuradas "/" e "/usuarios" #4 a partir das variáveis routes e users
Diretorios do projeto
Utilizando o modelo MVC - Model-View-Controller
└── projeto
├── controllers
├── models
├── node_modules
├── public
│ ├── css
│ ├── images
│ ├── js
├── routes
├── views
├── app.js
├── package.json
├── package-lock.json
└── .gitignore
Injeção de Módulos
Um problema comum:
Cada controller , quando for utilizar os models , realizará uma chamada a função require('/models/nome-do-
model');
Em controllers , ou qualquer outro código, diversas chamadas à função require serão realizadas, e isso pode gerar
uma poluição carregamento de módulos em um código.
Solução
plugin express-load responsável por mapear diretórios para carregar e injetar módulos dentro de uma variável que
definirmos na função load('módulos').into(app)
npm install express-load --save
/* Codigo Removido:
var routes = require("./routes/index");
var users = require("./routes/users");
var path = require("path"); */
app.use(express.static(path.join(__dirname, "public")));
//codigo adicionado
load('models')
.then('controllers')
.then('routes')
.into(app);
app.listen(3000, function () {
console.log("servidor rodando");
});
Atualizando as rotas
exclua os arquivos routes/user.js e routes/index.js
adicionar o arquivo routes/home.js
//arquivo: routes/home.js
module.exports = function (app) {
var home = app.controllers.home; // #1
app.get("/", home.index);
};
Adicionando os controladores
app possui a propriedade controllers devido ao express-load
app.controllers.home aponta para controllers/home.js
//arquivo: controllers/home.js
Adicionando os viewers
Exclua o arquivo views/index.ejs que foi criado pelo express-generator
Crie o arquivo views/home/index.ejs
Formulário HTML com os campos nome e email
<!--arquivo: /views/home/index.ejs-->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>PWeb2 - Agenda de contatos</title>
</head>
<body>
<header>
<h1>PWeb2 - Agenda online</h1>
<h4>Bem-vindo!</h4>
</header>
<section>
<form action="/entrar" method="post">
<input type="text" name="usuario[nome]" placeholder="Nome" />
<br />
<input type="text" name="usuario[email]" placeholder="E-mail" />
<br />
<button type="submit">Entrar</button>
</form>
</section>
<footer>
<small>PWeb2 - Agenda de contatos</small>
</footer>
</body>
</html>
Rode o projeto
Referências
Capítulo 4. Pereira, C. R. Node.js: Aplicações web real-time com Node.js. Casa do Código.