José M. Ciges - Febrero 2016
Código disponible en la carpeta "Ejercicios" (zip aquí)
Es un entorno de desarollo para aplicaciones en JavaScript
Es un entorno de desarollo para aplicaciones en JavaScript
Multiplataforma
Es un entorno de desarollo para aplicaciones en JavaScript
Multiplataforma
Gran rendimiento
Descargamos de http://nodejs.org el instalador para Windows
Para Linux descargamos el paquete .tar.xz
cd /opt xz -d node-v4.2.6-linux-x64.tar.xz tar -xvf node-v4.2.6-linux-x64.tar export PATH=/opt/node-v4.2.6-linux-x64/bin:$PATH
Un primer script :-)
$ node -e "console.log('Versión de Node.js ' + process.version)" Versión de Node.js v4.2.6
npm install
npm install -g node-dev
Programación asíncrona
process.stdin.on('data', function(data) { process.stdout.write("\nHas escrito " + data.toString().trim() + "\n"); }); process.stdout.write ("¿Cuál es tu hobby favorito?: ");
Programación asíncrona
process.stdin.on('data', function(data) { process.stdout.write("\nHas escrito " + data.toString().trim() + "\n"); }); process.stdout.write ("¿Cuál es tu hobby favorito?: ");
Funciones temporales
var maxTime = 15000;var passTime = 1000;var contador = 0;setInterval(function () { console.log("Ummmm .... han pasado " + Math.floor(contador/1000) + " segundos"); contador += passTime;}, passTime);setTimeout(function() { console.log("Quedan 5 segundos para terminar");}, maxTime - 5*1000);setTimeout(function () { console.log("Se ha superado el tiempo máximo de " + maxTime / 1000 + " segundos") process.exit();}, maxTime);
var EventEmitter = require('events').EventEmitter;var util = require('util');/* Definimos la clase */var Person = function(name) { this.name = name;};util.inherits(Person, EventEmitter);var mario = new Person("Mario Covarrubias");mario.on('speak', function (message) { console.log(`${this.name}: ${message}`)});mario.emit('speak', "El conocimiento no sirve de nada si no se comparte");
var EventEmitter = require('events').EventEmitter;var util = require('util');/* Definimos la clase */var Person = function(name) { this.name = name;};util.inherits(Person, EventEmitter);var mario = new Person("Mario Covarrubias");mario.on('speak', function (message) { console.log(`${this.name}: ${message}`)});mario.emit('speak', "El conocimiento no sirve de nada si no se comparte");
var fs = require("fs");var stream = fs.createReadStream("./descargas/node-v4.2.6-linux-x64.tar.xz", "UTF-8");var datos = "";var bytes = 0;stream.once("data", function() { console.log("Empezamos a leer el archivo\n\n");});stream.on("data", function(fragmento) { process.stdout.write(`leido fragmento de ${fragmento.length} bytes \n`); datos += fragmento; bytes += fragmento.length;});stream.on("end", function() { console.log(`\nLectura del archivo finalizada, total de bytes leidos: ${bytes}\n\n`);});
var fs = require("fs");var stream = fs.createReadStream("./descargas/node-v4.2.6-linux-x64.tar.xz", "UTF-8");var datos = "";var bytes = 0;stream.once("data", function() { console.log("Empezamos a leer el archivo\n\n");});stream.on("data", function(fragmento) { process.stdout.write(`leido fragmento de ${fragmento.length} bytes \n`); datos += fragmento; bytes += fragmento.length;});stream.on("end", function() { console.log(`\nLectura del archivo finalizada, total de bytes leidos: ${bytes}\n\n`);});
var http = require('http');var v8 = require('v8');var puerto = 9000;var servidor = http.createServer(function(req, res) { res.writeHead(200, {"Content-Type": "text/plain"}); res.write("Servidor creado con NodeJS " + process.version + "\n"); res.write("Estado de la memoria\n"); res.write(JSON.stringify(v8.getHeapStatistics(), null, "\t")); res.end();});servidor.listen(puerto);console.log(`Servidor arrancado en el puerto ${puerto}`);
var http = require("http");var fs = require("fs");var path = require("path");var port = 9000;http.createServer(function(req, res) { console.log(`${req.method} request for ${req.url}`); if (req.url === "/") { fs.readFile("./public/index.html", "UTF-8", function(err, html) { res.writeHead(200, {"Content-Type": "text/html"}); res.end(html); }); } else if (req.url.match(/.css$/)) { var cssPath = path.join(__dirname, 'public', req.url); var fileStream = fs.createReadStream(cssPath, "UTF-8"); res.writeHead(200, {"Content-Type": "text/css"}); fileStream.pipe(res);
} else if (req.url.match(/.jpg$/)) { var imgPath = path.join(__dirname, 'public', req.url); var imgStream = fs.createReadStream(imgPath); res.writeHead(200, {"Content-Type": "image/jpeg"}); imgStream.pipe(res); } else { res.writeHead(404, {"Content-Type": "text/plain"}); res.end("404 File Not Found"); }}).listen(port);console.log(`File server running on port ${port}`);
npm initnpm install express -save
npm initnpm install express -save
index.js
var express = require("express");var app = express();var puerto = 3000;app.use(function(req, res, next) { console.log(`${req.method} request for '${req.url}'`); next();});app.use(express.static("./public"));app.get('/', function(req, res) { res.send(`Servidor Express operativo en el puerto ${puerto}`);});app.listen(puerto);
npm initnpm install express -save
index.js
var express = require("express");var app = express();var puerto = 3000;app.use(function(req, res, next) { console.log(`${req.method} request for '${req.url}'`); next();});app.use(express.static("./public"));app.get('/', function(req, res) { res.send(`Servidor Express operativo en el puerto ${puerto}`);});app.listen(puerto);
node index
var express = require("express");var bodyParser = require("body-parser");...app.use(bodyParser.urlencoded({ extended: true }));app.use(bodyParser.json());...app.use(express.static("./public"));app.get('/', function(req, res) { res.send(`Servidor Express operativo en e puerto ${puerto}`);});app.get("/inventario", function(req, res) { res.json(inventario);});app.post("/inventario", function(req, res) { inventario.push(req.body); res.json(inventario);});...
...var express = require('express');var app = express(); var server = require('http').Server(app); var io = require('socket.io')(server); ...io.on('connection', function(socket) { console.log('Alguien se ha conectado con Sockets'); socket.emit('messages', messages); socket.on('new-message', function(data) { messages.push(data); // Reenviamos el mensaje a todos los clientes io.sockets.emit('messages', messages); });});
Ejercicio completo aquí, obtenido de este tutorial de Carlos Azaustre
// Nos conectamos al servidorvar socket = io.connect('http://elladogeekde.ciges.net:8080', { 'forceNew': true });socket.on('messages', function(data) { console.log(data); render(data);});// Modificación del HTML de la webfunction render(data) { ... };function addMesage(e) { var payload = { author: document.getElementById('username').value, text: document.getElementById('texto').value, } socket.emit('new-message', payload); return false;}
Ejercicio completo aquí, obtenido de este tutorial de Carlos Azaustre
Lenguaje de plantillas HTML desarrollado por el creador de Express
h1.titulo Ejemplo con Jadeh2.creditos Desarrollado por #{author}p Jade es un lenguaje de plantillas que se usa comunmente con:ul li a(href="http://nodejs.org/en/") Node.js li a(href="http://expressjs.com/es/") Express
Con "express-generator" podemos crear una estructura MVC inicial
Enlace interesante: "Jade Syntax Documentation by example"
var express = require('express'), http = require('http'), jade = require('jade') ;var app = express() ;var port = 3000;app.set( 'views', './views' ) ;app.set( 'view engine', 'jade' ) ;app.engine( 'jade', jade.__express ) ;app.locals = { author: 'Ciges',} ;app.get( '/', function( req, res ) { res.render( 'index' ) ;}) ;var server = app.listen( port, function() { console.log( 'App disponible en el puerto', port) ;});
...var mongo = require('mongodb');var monk = require('monk');var db = monk('localhost:27017/express_mongodb_db');.../* GET Userlist page. */router.get('/userlist', function(req, res) { var db = req.db; var collection = db.get('usercollection'); collection.find({},{},function(e,docs){ res.render('userlist', { "userlist" : docs }); });});...
El ejercicio está basado en este tutorial de Christopher Buecheler
Grunt nos permite automatizar los distintos pasos de despliegue de un proyecto
Se usa en la fase de desarrollo y se definen las tareas en el archivo "gruntfile.js"
Instalación de Grunt:
npm install -g grunt-clinpm install grunt --save-devnpm install grunt-contrib-jshint --save-devnpm install grunt-contrib-less --save-devnpm install grunt-contrib-watch --save-dev
Ejecución en un proyecto:
npm installgrunt
Otras herramientas interesantes: browserify y bower
Instalación y ejecución (doc completa aquí)
cd /var/wwwcurl -L -O https://ghost.org/zip/ghost-latest.zipunzip -d ghost ghost-latest.zipcd ghostnpm install --productionnpm install forever -gNODE_ENV=production forever start index.js
Para desarrollo
cd /var/www/git clone https://www.github.com/TryGhost/Ghost.git ghostcd ghost/git submodule update --initnpm install -g grunt-clinpm installgrunt init
Una vez arrancado y configurado queda disponible en el puerto 2368
Usamos el módulo node-inspector
npm install -g node-inspectornode-debug app.js
Y se abre en el navegador un entorno que nos permitirá depurar:
Para alojar nuestas aplicaciones Node.js necesitaremos:
Un servidor virtual o hosting compartido con acceso de shell
Y entre los hostings gratuítos podemos nombrar:
Esta resumen de la tecnología Node.js ha sido posible gracias, entre otros, fundamentalmente a:
Esta presentación ha sido hecha con tiempo, cariño, Sublime Text y Remark :-)
Keyboard shortcuts
↑, ←, Pg Up, k | Go to previous slide |
↓, →, Pg Dn, Space, j | Go to next slide |
Home | Go to first slide |
End | Go to last slide |
b / m / f | Toggle blackout / mirrored / fullscreen mode |
c | Clone slideshow |
p | Toggle presenter mode |
t | Restart the presentation timer |
?, h | Toggle this help |
Esc | Back to slideshow |