Esta traducci贸n proporcionada por StrongLoop / IBM.

Este documento puede estar desfasado respecto a la documentaci贸n en ingl茅s. Para ver las 煤ltimas actualizaciones, consulte la documentaci贸n en ingl茅s.

Migraci贸n a Express 4

Visi贸n general

Express 4 es un cambio que rompe el c贸digo existente de Express 3, etc. Esto implica que una aplicaci贸n Express 3 existente no funcionar谩 si actualiza la versi贸n de Express en sus dependencias.

En este art铆culo se describen:

Los cambios en Express 4

Se han realizado varios cambios importantes en Express 4:

Vea tambi茅n:

Cambios en el sistema principal y de middleware de Express

Express 4 ya no depende de Connect y elimina todo el middleware incorporado de su n煤cleo, excepto la funci贸n express.static. Esto significa que ahora Express es una infraestructura web de middleware y direccionamiento independiente, y que los releases y las versiones de Express no se ven afectados por las actualizaciones de middleware.

Sin el middleware incorporado, debe a帽adir expl铆citamente todo el middleware necesario para ejecutar la aplicaci贸n. S贸lo tiene que seguir estos pasos:

  1. Instalar el m贸dulo: npm install --save <module-name>
  2. En su aplicaci贸n, requerir el m贸dulo: require('module-name')
  3. Utilizar el m贸dulo seg煤n su documentaci贸n: app.use( ... )

En la tabla siguiente se lista el middleware de Express 3 y su contrapartida en Express 4.

Express 3Express 4
express.bodyParser body-parser + multer
express.compress compression
express.cookieSession cookie-session
express.cookieParser cookie-parser
express.logger morgan
express.session express-session
express.favicon serve-favicon
express.responseTime response-time
express.errorHandler errorhandler
express.methodOverride method-override
express.timeout connect-timeout
express.vhost vhost
express.csrf csurf
express.directory serve-index
express.static serve-static

Esta es la lista completa de middleware de Express 4.

En la mayor铆a de los casos, s贸lo tiene que sustituir el middleware de la versi贸n 3 antigua por su contrapartida de Express 4. Para obtener detalles, consulte la documentaci贸n del m贸dulo en GitHub.

app.use acepta par谩metros

En la versi贸n 4, puede utilizar un par谩metro de variable para definir la v铆a de acceso donde se cargan las funciones de middleware y, a continuaci贸n, leer el valor del par谩metro en el manejador de rutas. Por ejemplo:


app.use('/book/:id', function(req, res, next) {
  console.log('ID:', req.params.id);
  next();
});

El sistema de direccionamiento

Ahora las aplicaciones cargan impl铆citamente el middleware de direccionamiento, por lo que ya no tiene que preocuparse del orden con el que se carga el middleware respecto al middleware de router.

La forma en que define las rutas no var铆a, pero el sistema de direccionamiento tiene dos nuevas caracter铆sticas que permiten organizar las rutas:

M茅todo app.route()

El nuevo m茅todo app.route() permite crear manejadores de rutas encadenables para una v铆a de acceso de ruta. Como la v铆a de acceso se especifica en una 煤nica ubicaci贸n, la creaci贸n de rutas modulares es muy 煤til, al igual que la reducci贸n de redundancia y errores tipogr谩ficos. Para obtener m谩s informaci贸n sobre las rutas, consulte la documentaci贸n de Router().

A continuaci贸n, se muestra un ejemplo de manejadores de rutas encadenados que se definen utilizando la funci贸n app.route().


app.route('/book')
  .get(function(req, res) {
    res.send('Get a random book');
  })
  .post(function(req, res) {
    res.send('Add a book');
  })
  .put(function(req, res) {
    res.send('Update the book');
  });

Clase express.Router

La otra caracter铆stica que permite organizar las rutas es una nueva clase, express.Router, que puede utilizar para crear manejadores de rutas montables modulares. Una instancia Router es un sistema de middleware y direccionamiento completo; por este motivo, a menudo se conoce como una 鈥渕iniaplicaci贸n鈥.

El siguiente ejemplo crea un direccionador como un m贸dulo, carga el middleware en 茅l, define algunas rutas y lo monta en una v铆a de acceso en la aplicaci贸n principal.

Por ejemplo, cree un archivo de direccionador denominado birds.js en el directorio de la aplicaci贸n, con el siguiente contenido:


var express = require('express');
var router = express.Router();

// middleware specific to this router
router.use(function timeLog(req, res, next) {
  console.log('Time: ', Date.now());
  next();
});
// define the home page route
router.get('/', function(req, res) {
  res.send('Birds home page');
});
// define the about route
router.get('/about', function(req, res) {
  res.send('About birds');
});

module.exports = router;

A continuaci贸n, cargue el m贸dulo de direccionador en la aplicaci贸n:


var birds = require('./birds');
...
app.use('/birds', birds);

La aplicaci贸n ahora podr谩 manejar solicitudes a las v铆as de acceso /birds y /birds/about, e invocar谩 el middleware timeLog que es espec铆fico de la ruta.

Otros cambios

En la tabla siguiente se muestran otros cambios peque帽os pero importantes en Express 4:

Objeto Descripci贸n
Node.js Express 4 requiere Node.js 0.10.x o posterior y deja de dar soporte a Node.js 0.8.x.

http.createServer()

El m贸dulo http ya no es necesario, a menos que necesite trabajar directamente con 茅l (socket.io/SPDY/HTTPS). La aplicaci贸n puede iniciarse utilizando la funci贸n app.listen().

app.configure()

La funci贸n app.configure() se ha eliminado. Utilice la funci贸n process.env.NODE_ENV o app.get('env') para detectar el entorno y configure la aplicaci贸n seg煤n corresponda.

json spaces

La propiedad de aplicaci贸n json spaces est谩 inhabilitada de forma predeterminada en Express 4.

req.accepted()

Utilice req.accepts(), req.acceptsEncodings(), req.acceptsCharsets() y req.acceptsLanguages().

res.location()

Ya no resuelve los URL relativos.

req.params

Era una matriz, ahora es un objeto.

res.locals

Era una funci贸n, ahora es un objeto.

res.headerSent

Se ha cambiado por res.headersSent.

app.route

Ahora est谩 disponible como app.mountpath.

res.on('header')

Se ha eliminado.

res.charset

Se ha eliminado.

res.setHeader('Set-Cookie', val)

La funcionalidad est谩 ahora limitada a establecer el valor de cookie b谩sico. Utilice res.cookie() para obtener la funcionalidad adicional.

Migraci贸n de aplicaci贸n de ejemplo

A continuaci贸n, se muestra un ejemplo de migraci贸n de una aplicaci贸n Express 3 a Express 4. Los archivos de inter茅s son app.js y package.json.

Aplicaci贸n versi贸n 3

app.js

Considere una aplicaci贸n Express v.3 con el siguiente archivo app.js:


var express = require('express');
var routes = require('./routes');
var user = require('./routes/user');
var http = require('http');
var path = require('path');

var app = express();

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.methodOverride());
app.use(express.session({ secret: 'your secret here' }));
app.use(express.bodyParser());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));

// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

app.get('/', routes.index);
app.get('/users', user.list);

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

package.json

El archivo package.json de la versi贸n 3 correspondiente ser谩 similar al siguiente:


{
  "name": "application-name",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {
    "express": "3.12.0",
    "pug": "*"
  }
}

Proceso

Para empezar el proceso de migraci贸n, instale el middleware necesario para la aplicaci贸n Express 4 y actualice Express y Pug a su versi贸n respectiva m谩s reciente con el siguiente mandato:


$ npm install serve-favicon morgan method-override express-session body-parser multer errorhandler express@latest pug@latest --save

Realice los cambios siguientes en app.js:

  1. Las funciones de middleware de Express incorporadas express.favicon, express.logger, express.methodOverride, express.session, express.bodyParser y express.errorHandler ya no est谩n disponibles en el objeto express. Debe instalar sus alternativas manualmente y cargarlas en la aplicaci贸n.

  2. Ya no es necesario cargar la funci贸n app.router. No es un objeto de aplicaci贸n Express 4 v谩lido, por lo que debe eliminar el c贸digo app.use(app.router);.

  3. Aseg煤rese de que las funciones de middleware se cargan en el orden correcto: cargue errorHandler despu茅s de cargar las rutas de aplicaci贸n.

Aplicaci贸n versi贸n 4

package.json

La ejecuci贸n del mandato npm anterior actualizar谩 package.json de la siguiente manera:


{
  "name": "application-name",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {
    "body-parser": "^1.5.2",
    "errorhandler": "^1.1.1",
    "express": "^4.8.0",
    "express-session": "^1.7.2",
    "pug": "2.0.0-beta6",
    "method-override": "^2.1.2",
    "morgan": "^1.2.2",
    "multer": "^0.1.3",
    "serve-favicon": "^2.0.1"
  }
}

app.js

A continuaci贸n, elimine el c贸digo no v谩lido, cargue el middleware necesario y realice otros cambios seg煤n sea necesario. El archivo app.js ser谩 parecido al siguiente:


var http = require('http');
var express = require('express');
var routes = require('./routes');
var user = require('./routes/user');
var path = require('path');

var favicon = require('serve-favicon');
var logger = require('morgan');
var methodOverride = require('method-override');
var session = require('express-session');
var bodyParser = require('body-parser');
var multer = require('multer');
var errorHandler = require('errorhandler');

var app = express();

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');
app.use(favicon(__dirname + '/public/favicon.ico'));
app.use(logger('dev'));
app.use(methodOverride());
app.use(session({ resave: true,
                  saveUninitialized: true,
                  secret: 'uwotm8' }));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(multer());
app.use(express.static(path.join(__dirname, 'public')));

app.get('/', routes.index);
app.get('/users', user.list);

// error handling middleware should be loaded after the loading the routes
if ('development' == app.get('env')) {
  app.use(errorHandler());
}

var server = http.createServer(app);
server.listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

A menos que necesite trabajar directamente con el m贸dulo http (socket.io/SPDY/HTTPS), no es necesario cargarlo y la aplicaci贸n puede iniciarse simplemente de la siguiente manera:

app.listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

Ejecutar la aplicaci贸n

El proceso de migraci贸n est谩 completo y la aplicaci贸n es ahora una aplicaci贸n Express 4. Para confirmarlo, inicie la aplicaci贸n utilizando el siguiente mandato:


$ node .

Cargue http://localhost:3000 y vea la p谩gina de inicio que representa Express 4.

La actualizaci贸n al generador de aplicaciones Express 4

La herramienta de l铆nea de mandatos para generar una aplicaci贸n Express contin煤a siendo express, pero para actualizar a la nueva versi贸n, debe desinstalar el generador de aplicaciones Express 3 e instalar el nuevo express-generator.

Instalaci贸n

Si ya ha instalado el generador de aplicaciones Express 3 en el sistema, debe desinstalarlo:


$ npm uninstall -g express

Dependiendo de c贸mo se configuren los privilegios de archivos y directorios, deber谩 ejecutar este mandato con sudo.

A continuaci贸n, instale el nuevo generador:


$ npm install -g express-generator

Dependiendo de c贸mo se configuren los privilegios de archivos y directorios, deber谩 ejecutar este mandato con sudo.

Ahora el mandato express en el sistema se actualiza al generador de Express 4.

Cambios en el generador de aplicaciones

Las opciones de mandato y el uso contin煤an pr谩cticamente iguales, con las siguientes excepciones:

Ejemplo

Ejecute el siguiente mandato para crear una aplicaci贸n Express 4:


$ express app4

Si consulta el contenido del archivo app4/app.js, observar谩 que todas las funciones de middleware (excepto express.static) que son necesarias para la aplicaci贸n se cargan como m贸dulos independientes y que el middleware de router ya no se carga de forma expl铆cita en la aplicaci贸n.

Tambi茅n observar谩 que el archivo app.js es ahora un m贸dulo Node.js, a diferencia de la aplicaci贸n aut贸noma que generaba el antiguo generador.

Despu茅s de instalar las dependencias, inicie la aplicaci贸n utilizando el siguiente mandato:


$ npm start

Si consulta el script de inicio npm en el archivo package.json, observar谩 que el mandato que inicia la aplicaci贸n es node ./bin/www, que antes era node app.js en Express 3.

Como el archivo app.js que generaba el generador de Express 4 ahora es un m贸dulo Node.js, ya no puede iniciarse independientemente como una aplicaci贸n (a menos que modifique el c贸digo). El m贸dulo debe cargarse en un archivo Node.js e iniciarse utilizando el archivo Node.js. El archivo Node.js es ./bin/www en este caso.

Ni el directorio bin ni el archivo www sin extensi贸n son obligatorios para crear una aplicaci贸n Express o iniciar la aplicaci贸n. Son s贸lo sugerencias realizadas por el generador, por lo que puede modificarlos seg煤n sus necesidades.

Para eliminar el directorio www y dejarlo todo como en 鈥淓xpress 3鈥, suprima la l铆nea module.exports = app; al final del archivo app.js y pegue el siguiente c贸digo en su lugar:


app.set('port', process.env.PORT || 3000);

var server = app.listen(app.get('port'), function() {
  debug('Express server listening on port ' + server.address().port);
});

Aseg煤rese de cargar el m贸dulo debug encima del archivo app.js utilizando el c贸digo siguiente:


var debug = require('debug')('app4');

A continuaci贸n, cambie "start": "node ./bin/www" en el archivo package.json por "start": "node app.js".

Ahora ha devuelto la funcionalidad de ./bin/www a app.js. Este cambio no se recomienda, pero el ejercicio permite entender c贸mo funciona el archivo ./bin/www y por qu茅 el archivo app.js ya no se inicia solo.