Del infierno al cielo

Preview:

Citation preview

Del infierno al cieloRaúl Requero@rrequeroMADRID · NOV 27-28 · 2015

MADRID · NOV 27-28 · 2015

¿Quien soy?

Raúl Requero GarcíaFullstack developer

@rrequero

MADRID · NOV 27-28 · 2015

Recursos

https://github.com/rrequero/resources-delInfiernoAlCielo

MADRID · NOV 27-28 · 2015

var fs = require('fs');fs.readFile('file1.txt', 'utf8', function(err, data1) {

if (err) { return console.log(err); }fs.readFile('file2.txt', 'utf8', function(err, data2) {

if (err) { return console.log(err);} fs.readFile('file3.txt', 'utf8', function(err, data3) {

if (err) { return console.log(err); } fs.writeFile("completeFile.txt", data1+data2+data3, function(err) {

if (err) { return console.log(err); }console.log("File saved!");

}); });

});});

MADRID · NOV 27-28 · 2015

var fs = require('fs');fs.readFile('file1.txt', 'utf8', function(err, data1) {

if (err) { return console.log(err); }fs.readFile('file2.txt', 'utf8', function(err, data2) {

if (err) { return console.log(err);} fs.readFile('file3.txt', 'utf8', function(err, data3) {

if (err) { return console.log(err); } fs.writeFile("completeFile.txt", data1+data2+data3, function(err) {

if (err) { return console.log(err); }console.log("File saved!");

}); });

});});

MADRID · NOV 27-28 · 2015

Posibles soluciones

Promisesvar promise = readFile('file1.txt', 'utf8');promise.then(function(content){

console.log(content);});promise.catch(function(error){

console.error(error);});

MADRID · NOV 27-28 · 2015

Generadores

http://www.ecma-international.org/ecma-262/6.0/

MADRID · NOV 27-28 · 2015

¿Que son?

Los generadores son funciones que permiten tener múltiples puntos de entrada para la suspensión y reanudación de la ejecución.

Los generadores son subtipos de Iterator que incluyen el métodos next.

Este comportamiento es posible utilizando funciones especiales que devuelven un objeto Generador. ( function * (...) ). Dentro de la función se usan las palabras claves yield y yield* para devolver u obtener un valor y throw para lanzar un error.

Una función Generador al ejecutarse comienza en estado suspendido y no comienza su ejecución hasta que se ejecuta por primera vez el método next del objeto Generador devuelto al ejecutar la función

MADRID · NOV 27-28 · 2015

¿Para que no usarlos?

El rendimiento empeora

MADRID · NOV 27-28 · 2015

¿Para que usarlos?

Lazy evaluation (Evaluación perezosa)

Secuencias infinitas

Flujo de control asincrono

MADRID · NOV 27-28 · 2015

Secuencias infinitas

MADRID · NOV 27-28 · 2015

Flujo de control asíncrono

MADRID · NOV 27-28 · 2015

Librerías disponibles

● Co: https://www.npmjs.com/package/co

● Thunks: https://www.npmjs.com/package/thunks

MADRID · NOV 27-28 · 2015

var thunks = require('thunks')();var fs = require('fs');var co = require('co');

var readFile = thunks.thunkify(fs.readFile);var writeFile = thunks.thunkify(fs.writeFile);

co(function* (){try{

var data1 = yield readFile('file1.txt', 'utf8');var data2 = yield readFile('file2.txt', 'utf8');var data3 = yield readFile('file3.txt', 'utf8');

yield writeFile('completeFileSequential.txt', data1+data2+data3);console.log(‘File saved!’);

}catch(e){console.log(e);

}});

MADRID · NOV 27-28 · 2015

MADRID · NOV 27-28 · 2015

¿Que es? Web framework Creado por el equipo que creo ExpressJS Usa generadores (Basado en la librería co) Mejor manejo de los errores Core muy simple, no incorpora middlewares

MADRID · NOV 27-28 · 2015

Diferencias entre Koa y ExpressFuncionalidad Koa Express

Middleware Kernel X X

Routing X

Templating X

Sending Files X

JSONP X

MADRID · NOV 27-28 · 2015

Diferencias entre Koa y ExpressFuncionalidad Koa Express

Middleware Kernel X X

Routing (koa-router) X

Templating (koa-render) X

Sending Files (koa-send) X

JSONP (koa-jsonp) X

MADRID · NOV 27-28 · 2015

Primer app con Koa

var koa = require('koa');var app = koa();

app.use(function *(){ this.body = 'Hello World';});

app.listen(3000);

MADRID · NOV 27-28 · 2015

CascadingMismo sistema de middlewares que otros frameworks.

Podemos lograr ‘true middleware’

MADRID · NOV 27-28 · 2015

Error handlingPor defecto todos los errores se imprimen en stderr

Si NODE_ENV=test los errores no salen por stderr.

app.on('error', function(err, ctx){ log.error('server error', err, ctx);});

MADRID · NOV 27-28 · 2015

Context Encapsula los objetos request y response

Se crea una por cada request

Incluye métodos de ayuda

Se accede a él a traves de this

MADRID · NOV 27-28 · 2015

Context API ctx.req: Objeto request

ctx.res: Objeto response

ctx.state: Espacio de nombres recomendado para pasar información entre los middlewares

ctx.app: Referencia a la instancia de la aplicación

MADRID · NOV 27-28 · 2015

Context API Cookies:

Koa usa la librería: https://github.com/jed/cookies

∘ ctx.cookies.get(name, [options]): Obtener una cookie por nombre

∘ ctx.cookies.set(name, value, [options]): Crear una cookie

MADRID · NOV 27-28 · 2015

Context API Throw:

Koa usa la librería: (http-errors)https://github.com/jshttp/http-errors

∘ ctx.throw([msg], [errorCode],[properties])

Ej: this.throw(403, ‘Not authorized’)

MADRID · NOV 27-28 · 2015

Context API Assert:

Koa usa la librería: (http-assert) https://github.com/jshttp/http-assert

∘ ctx.assert(value, [msg], [errorCode], [properties])

Ej: this.assert(this.user, ‘Not authorized’, 403)

MADRID · NOV 27-28 · 2015

Context API Alias:

Existen alias para los atributos más utilizados

Request:- header- headers- method- url- ip- etc...

Response:- body- status- message- type- length- etc...

MADRID · NOV 27-28 · 2015

Middlewares Koa-router: https://github.com/alexmingoia/koa-router

Koa-body-parser:https://github.com/koajs/bodyparser

Koa-render: https://github.com/queckezz/koa-views

MADRID · NOV 27-28 · 2015

Middlewares koa-mount: https://github.com/koajs/mount

koa-session: https://github.com/koajs/session

koa-static:https://github.com/koajs/static

koa-logger:https://github.com/koajs/logger (dev)

MADRID · NOV 27-28 · 2015

Ejemplo api

MADRID · NOV 27-28 · 2015

MADRID · NOV 27-28 · 2015