Node.js
Aplicação node simples
Criando um projeto básico:
mkdir app
cd app
npm init
Alguns módulos úteis:
npm install express --save
npm install grunt --save
npm install gulp --save-dev
Configurar NPM para trabalhar com Proxy no Windows
No arquivo C:\Users\USUARIO.npmrc incluir estas linhas:
strict-ssl=false
registry=http://registry.npmjs.org/
proxy=http://usuario:senha@servidor.proxy:8080
https-proxy=http://usuario:senha@servidor.proxy:8080
Referência => http://stackoverflow.com/questions/7559648/is-there-a-way-to-make-npm-install-the-command-to-work-behind-proxy
Argumentos de linha de comando
argc -> process.argv.length
argv -> process.argv[0], process.argv[1]...
Instalação do módulo para acesso ao Oracle DB
Configurar variáveis de ambiente:
set OCI_LIB_DIR=C:\Oracle\product\11.2.0\client_1\oci\lib\msvc
set OCI_INC_DIR=C:\Oracle\product\11.2.0\client_1\oci\include
Apontar para o caminho do Python 2.7:
set PATH=C:\Programas\python-2.7.9;%PATH%
Preparar variáveis de ambiente do compilador C++:
"C:\Program Files\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat"
Acessar o diretório do projeto:
cd C:\Dev\js\node-ora
Instalar o módulo:
npm install oracledb
Gerador de aplicação express
Gerador de “scaffold” para aplicações express.
Instalar:
npm install -g express-generator
Gerar aplicação na pasta .\exemplo_app e instala dependências:
express exemplo_app
cd exemplo_app
npm install
Executar aplicação em modo de depuração:
SET DEBUG=exemplo_app:*
npm start
Para gerar aplicação usando view engine EJS (o padrão é JADE):
express -e exemplo_ejs
Configurar rotas separadas por módulos
Na aplicação (app.js) principal:
var exemplo = require("./routers/exemplo.js");
app.use("/exemplo", exemplo);
Em /routers/exemplo.js:
var express = require("express");
var router = express.Router();
router.get("/", function (req, res) {
res.send("exemplo módulo roteador");
});
module.exports = router;
Configurar e rodar instância do MongoDB Server
Diretório de instalação do exemplo: C:\mongodb
Arquivo de configuração (C:\mongodb\mongodb.cfg):
systemLog:
verbosity: 1
destination: file
path: C:\mongodb\data\log\mongod.log
logAppend: true
storage:
dbPath: C:\mongodb\data\db
engine: mmapv1
journal:
enabled: true
net:
bindIp: 127.0.0.1
port: 27017
setParameter:
enableLocalhostAuthBypass: true
Executando a instância:
C:\mongodb\MongoDB\Server\3.2\bin\mongod.exe --noauth --config C:\mongodb\mongodb.cfg
Cliente:
C:\mongodb\MongoDB\Server\3.2\bin\mongo
Express
Um exemplo simples de “Hello World”:
var express = require('express');
var app = express();
app.get('/', function (req, res) {
res.send('hello world');
});
app.post('/hello', function (req, res) {
var result = {};
result.hello = 'world';
res.send(result);
});
app.listen(3000);
Servir arquivos estáticos:
var path = require('path');
app.use(express.static(path.join(__dirname, 'public')));
Configurar uma view engine:
// Indica caminho onde estão as views
app.set('views', path.join(__dirname, 'views'));
// Escolher a view engine a ser utilizada (requer instalação)
app.set('view engine', 'jade');
// ou
app.set('view engine', 'ejs');
Usando MORGAN para logar mensagens no console de desenvolvimento:
// npm install morgan --save
var logger = require('morgan');
app.use(logger('dev'));
Usando BODY-PARSER para tratar os campos de formulário na requisição (x-www-form-urlencoded):
// npm install body-parser --save
var parser = require('body-parser');
app.use(parser.urlencoded({extended: false}));
app.post('/exemplo', function (req, res) {
res.send(req.body.exemplo);
});
Parâmetros e query string:
// /exemplo/123 => 123
app.get('/exemplo/:id', function (req, res) {
res.send(req.params.id);
});
// /busca?termo=teste&pagina=3 => Termo: teste Pagina: 3
app.get('/busca', function (req, res) {
res.send('Termo: ' + req.query.termo + ' Pagina: ' + req.query.pagina);
});
Definindo rotas/handlers
Sintaxe:
app.VERB(path, [callback...], callback);
Exemplos:
// Respondendo uma solicitação GET simples
app.get('/', function (req, res) {
res.send('hello');
});
// Respondendo uma solicitação POST com erro
app.post('/something_wrong', function (req, res) {
res.status(500);
res.render('error');
});
// Criando um handler que manipula request/response
app.use(function (req, res, next) {
req._something = 'empty';
res._something = 'handler';
next();
});
// Criando um handler que utiliza o request/response manipulado
app.use(function (req, res, next) {
console.log('This > ' + req._something + ' -> ' + res._something);
next();
});
// Devolve uma view renderizada
app.get('/foo', function (req, res) {
res.render('foo', {title: 'Bar'});
});
Requisição
app.METHOD(PATH, function (req, res) {
req.params.XXX // Parâmetros identificados em path
req.query.XXX // Valores passados na querystring ex: ?a=1&b=2&c=3
req.body.XXX // Valores do formulário (necessita do middleware body-parser)
});
Resposta
app.METHOD(PATH, function (req, res) {
res.send('abc'); // Responde com conteúdo simples
res.sendFile('caminho/arquivo.txt'); // Responde com conteúdo do arquivo
res.json(obj); // Devolve um objeto JSON
res.render('nomeview', obj); // Renderiza view conforme view engine utilizada
});
JADE
h1= title
p Hello from #{title}
EJS
Variável simples:
<h1><%= title %></h1>
<p>Hello from <%= title %></p>
Incluir parciais:
<% include ../partials/footer %>
Loop: <% items.forEach(function(item) { %> <li><%= item.name %> - <%= item.value %></li> <% }); %>
GULP
Instalando (desenvolvimento):
npm i --save-dev gulp
Exemplo mínimo:
var gulp = require('gulp');
gulp.task('hello', function () {
console.log('hello');
return;
});
gulp.task('default', ['hello']);
Executando:
gulp // executa as tarefas padrão
-ou-
gulp hello // executa uma tarefa específica
Rodando lint (verifica boas práticas) nos arquivos .js:
npm i --save-dev jshint gulp-jshint
var gulp = require('gulp');
var jshint = require('gulp-jshint');
gulp.task('lint', function () {
return gulp.src('js/*.js')
.pipe(jshint())
.pipe(jshint.reporter('default'));
});
gulp.task('default', ['lint']);
Errors
On windows, when starting a project with npm run start:dev
or similar you get an error message saying
‘NODE_ENV’ is not recognized.
Your package.json
says something like:
"scripts": {
"start:dev": "NODE_ENV=development nodemon"
}
To fix, install win-node-env
:
npm install -g win-node-env
npm run start:dev