Tento dokument m├┤┼że by┼ą v porovnan├ş s dokument├íciou v angli─Źtine zastaral├Ż. Aktu├ílne inform├ície n├íjdete v dokument├ícii v angli─Źtine.

Ôťľ

Prechod na Express 4

Overview

Express 4 prin├í┼ía zlomov├ę zmeny oproti Express 3. To znamen├í, ┼że existuj├║ce Express 3 aplik├ície nebud├║ fungova┼ą po update verzie Express a jej dependenci├ş.

Tento ─Źl├ínok pokr├Żva:

Zmeny v Express 4

Express 4 prin├í┼ía nieko─║ko podstatn├Żch zmien:

Pozrite sa taktie┼ż na:

Zmeny Express jadra a middleware syst├ęmu

Express 4 u┼ż nie je z├ívisl├Ż na Connect a z jeho jadra boli odstr├ínen├ę v┼íetky vstavan├ę middleware funkcie, okrem express.static funkcie. To znamen├í, ┼że Express je teraz nez├ívisl├Żm routing a middleware webov├Żm frameworkom a taktie┼ż verzionovanie Express a jeho releasy nie s├║ ovplyvnen├ę updatami middlewarov.

Terazm bez vstavan├Żch middlewarov, mus├şte explicitne prida┼ą v┼íetky middleware funkcie, ktor├ę va┼ía aplik├ícia potrebuje k svojmu fungovaniu. Jednoducho pokra─Źujte pod─ża nasleduj├║cich krokov:

  1. Nain┼ítalujte po┼żadovan├Ż modul: npm install --save <module-name>
  2. Pridajte vo va┼íej aplik├ícii require na dan├Ż modul: require('module-name')
  3. Pou┼żite modul pod─ża jeho dokument├ície: app.use( ... )

Nasleduj├║ca tabu─żka obsahuje zoznam Express 3 middlewarov a ich varianty v 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

Tu je kompletn├Ż zoznam Express 4 middlewarov.

Vo v├Ą─Ź┼íine pr├şpadov m├┤┼żete jednoducho nahradi┼ą star├Ż Express 3 middleware jeho Express 4 variantou. Pre viac inform├íci├ş si pozrite dokument├íciu dan├ęho modulu na Github-e.

app.use pr├şjma parameter

Vo verzii 4 m├┤┼żete pou┼żi┼ą volite─żn├Ż parameter k definovaniu path-u, kedy sa m├í middleware funkcia na─Ź├şta┼ą a n├ísledne pre─Ź├şta┼ą hodnotu parametra z route handlera. Napr.:


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

Routing syst├ęm

Aplik├ícia odteraz explicitne na─Ź├şta routing middleware, tak┼że u┼ż sa viac nemus├şte stara┼ą o to, v akom porad├ş bude ktor├Ż middleware na─Ź├ştan├Ż s oh─żadom na router middleware.

Sp├┤sob, ak├Żm definujete route sa nezmenil, ale samotn├Ż routing syst├ęm m├í dve nov├ę features k jeho lep┼íej organiz├ícii:

app.route() met├│da

Nov├í met├│da app.route() v├ím umo┼ż┼łuje vytv├íra┼ą zre┼ąazite─żn├ę route handlery pre dan├Ż route path (cestu). Preto┼że je path (cesta) ┼ípecifikovan├Ż na jednom mieste, tvorba tak├Żchto modul├írnych routes je u┼żito─Źn├í, ked┼że zni┼żuje redundanciu a mo┼żn├ę preklepy. Pre viac inform├íci├ş oh─żadom route sa pozrite na Router() dokument├íciu.

Tu je pr├şklad zre┼ąazen├Żch route handlerov definovan├Żch pomocou app.route() funkcie.


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');
  });

express.Router trieda

─Äal┼íou novou feature, ktor├í napom├íha k lep┼íej organiz├ícii routes, je nov├í trieda express.Router, ktor├║ m├┤┼żete pou┼żi┼ą k tvorbe modul├írnych, pripojite─żn├Żch route handlerov. Router in┼ítancia je kompletn├Ż middleware routing syst├ęm; z tohto d├┤vodu je ─Źasto ozna─Źovan├í aj ako ÔÇťmini-appÔÇŁ.

Nasleduj├║ci pr├şklad vytv├íra router ako modul, na─Ź├ştava v ┼łom middleware, definuje nieko─żko routes a prip├íja tento router na path v hlavnej aplik├ícii.

Napr., vytvorte v prie─Źinku va┼íej aplik├ície router s├║bor s n├ízvom birds.js s tak├Żmto obsahom:


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;

Potom tento router na─Ź├ştajte vo va┼íej aplik├ícii:


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

Aplik├ícia bude odteraz schopn├í obsl├║┼żi┼ą requesty na path-och /birds a /birds/about a zavol├í timeLog middleware, ktor├Ż je ┼ípecifick├Ż pre tento route.

Ostatn├ę zmeny

Nasleduj├║ca tabu─żka obsahuje zoznam drobn├Żch, ale d├┤le┼żit├Żch zmien v Express 4:

Objekt Popis
Node.js Express 4 si vy┼żaduje Node.js 0.10.x a vy┼í┼í├ş a u┼ż nepodporuje Node.js 0.8.x.

http.createServer()

http modul u┼ż nie je potrebn├Ż, pokia─ż s n├şm nepotrebujete priamo pracova┼ą (socket.io/SPDY/HTTPS). Aplik├íciu dok├í┼żete na┼ítartova┼ą pomocou app.listen() funkcie.

app.configure()

Funkcia app.configure() bola odstr├ínen├í. Pre detekciu environment nastaven├ş a nastavenia aplik├ície pou┼żite process.env.NODE_ENV alebo funkciu app.get('env').

json spaces

Aplika─Źn├í property json spaces je defaultne v Express 4 vypnut├í.

req.accepted()

Pou┼ż├şvajte req.accepts(), req.acceptsEncodings(), req.acceptsCharsets() a req.acceptsLanguages().

res.location()

U┼ż viac nevyhodnocuje relat├şvne URLky.

req.params

Bolo p├┤vodne pole, teraz je objektom.

res.locals

Bola p├┤vodne funkcia, teraz je objekt.

res.headerSent

Zmenená na res.headersSent.

app.route

Teraz dostupná ako app.mountpath.

res.on('header')

Zmazan├ę.

res.charset

Zmazan├ę.

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

Funkcionalita je odteraz obmedzen├í na nastavenie z├íkladnej hodnoty cookie. Pre pridan├║ funkcionalitu pou┼ż├şvajte res.cookie().

Pr├şklad migr├ície aplik├ície

Tu je pr├şklad migr├ície Express 3 aplik├ície na Express 4. S├║bory, ktor├ę v├ís m├┤┼żu zauj├şma┼ą s├║ app.js a package.json.

Applikácia vo verzii 3

app.js

Majme tak├║to Express v.3 aplik├íciu s tak├Żmto app.js s├║borom:


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

Sprievodn├Ż package.json pre verziu 3 by vyzeral nejak takto:


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

Proces

Proces migr├ície za─Źnite nain┼ítalovan├şm v┼íetk├Żch potrebn├Żch middlewarov pre va┼íu Express 4 aplik├íciu a updatom Express a Pug na ich prisl├║chaj├║ce najnov┼íie verzie nasleduj├║cim pr├şkazom:


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

V app.js vykonajte tieto zmeny:

  1. Vstavan├ę Express middleware funkcie express.favicon, express.logger, express.methodOverride, express.session, express.bodyParser a express.errorHandler u┼ż nie s├║ dostupn├ę na express objekte. Mus├şte nain┼ítalova┼ą a na─Ź├şta┼ą ich prisl├║chaj├║ce alternat├şvy v aplik├ícii manu├ílne.

  2. U┼ż viac nepotrebujete na─Ź├şta┼ą app.router funkciu. Nieje validn├Żm Express 4 app objektom, preto zma┼żte nasleduj├║ci k├│d app.use(app.router);.

  3. Uistite sa, ┼że middleware funkcie s├║ na─Ź├ştan├ę v spr├ívnom porad├ş - na─Ź├ştajte errorHandler a┼ż po na─Ź├ştan├ş app routes.

Aplikácia vo verzii 4

package.json

Spusten├şm k├│du vy┼í┼íie, npm pr├şkaz updatne package.json nasledovne:


{
  "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

Potom zma┼żte nespr├ívny k├│d, na─Ź├ştajte potrebn├ę middlewary a vykonajte ─Ćal┼íie potrebn├ę zmeny. S├║bor app.js bude potom vyzera┼ą takto:


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'));
});

Pokia─ż nepotrebujete priamo pracova┼ą s http modulom (socket.io/SPDY/HTTPS), nie je nutn├ę ho na─Ź├şta┼ą a aplik├íciu m├┤┼żete jednoducho na┼ítartova┼ą t├Żmto sp├┤sobom:

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

Spustite aplikáciu

Proces migr├ície je kompletn├Ż a aplik├ícia je teraz Express 4 aplik├íciou. Pre overenie spustite aplik├íciu pomocou nasleduj├║ceho pr├şkazu:


$ node .

Na─Ź├ştajte v prehliada─Źi http://localhost:3000 a pozrite si domovsk├║ str├ínku aplik├ície vyrendrovan├║ pomocou Express 4.

Prechod na Express 4 app generátor

Tento command-line tool sl├║┼żiaci na generovanie Express aplik├ície je st├íle express, ale k tomu, aby ste vykonali upgrade na nov├║ verziu mus├şte najprv p├┤vodn├Ż Express 3 app gener├ítor odin┼ítalova┼ą a potom nain┼ítalova┼ą nov├Ż express-generator.

Inštalácia

Ak u┼ż m├íte Express 3 app gener├ítor na va┼íom syst├ęme nain┼ítalovan├Ż, mus├şte ho najsk├┤r odin┼ítalova┼ą:


$ npm uninstall -g express

V z├ívislosti od toho, ako s├║ nakonfigurovan├ę va┼íe opr├ívnenia k s├║borom a prie─Źinkom, m├┤┼że by┼ą potrebn├ę spusti┼ą tento pr├şkaz pomocou sudo.

Teraz nain┼ítalujte nov├Ż gener├ítor:


$ npm install -g express-generator

V z├ívislosti od toho, ako s├║ nakonfigurovan├ę va┼íe opr├ívnenia k s├║borom a prie─Źinkom, m├┤┼że by┼ą potrebn├ę spusti┼ą tento pr├şkaz pomocou sudo.

Teraz je pr├şkaz express aktualizovan├Ż na va┼íom syst├ęme na Express 4 gener├ítor.

Zmeny app generátora

Prep├şna─Źe a pou┼żitia pr├şkazu zostali preva┼żne rovnak├ę, okrem nasleduj├║cich v├Żnimiek:

Pr├şklad

K vytvoreniu Express 4 aplik├ície spustite nasleduj├║ci pr├şkaz:


$ express app4

Ak sa pozriete na obsah app4/app.js s├║boru, v┼íimnete si, ┼że v┼íetky middleware funkcie (okrem express.static), ktor├ę s├║ potrebn├ę pre aplik├íciu, s├║ na─Ź├ştan├ę ako samostatn├ę, nez├ívisl├ę moduly a router middleware u┼ż nie je v aplik├ícii explicitne na─Ź├ştan├Ż.

Taktie┼ż si v┼íimnite, ┼że s├║bor app.js je odteraz Node.js modulom, v porovnan├ş so standalone aplik├íciou vygenerovanou star├Żm gener├ítorom.

Po nain┼ítalovan├ş z├ívislost├ş spustite aplik├íciu pomocou nasleduj├║ceho pr├şkazu:


$ npm start

Ak sa pozriete na npm start skript v package.json s├║bore, v┼íimnete si, ┼że aktu├ílny pr├şkaz pre spustenie aplik├ície je node ./bin/www, ktor├Ż bol v Express 3 p├┤vodne node app.js.

Preto┼że s├║bor app.js, ktor├Ż bol vygenerovan├Ż Express 4 gener├ítorom je odteraz Node.js modul, u┼ż nem├┤┼że by┼ą viacej spusten├Ż nez├ívisle ako aplik├ícia (pokia─ż nezmen├şte k├│d). Modul mus├ş by┼ą na─Ź├ştan├Ż a spusten├Ż ako Node.js s├║bor. Node.js s├║bor je v tomto pr├şpade./bin/www.

Prie─Źinok bin ani bezpr├şponov├Ż s├║bor www nie s├║ povinn├ę k vytvoreniu ani spusteniu aplik├ície. S├║ len n├ívrhom vyroben├Żm gener├ítorom, tak┼że ich m├┤zete zmeni┼ą pod─ża va┼íich potrieb.

Ak sa chcete zbavi┼ą www prie─Źinka a ponecha┼ą to v starom ÔÇťExpress 3 form├íteÔÇŁ, zma┼żte riadok module.exports = app; na konci app.js s├║boru a namiesto neho vlo┼żte nasleduj├║ci k├│d:


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

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

Uistite sa, ┼że ste na─Ź├ştali debug modul, v hornej ─Źasti v├í┼ího app.js s├║boru, pou┼żit├şm nasleduj├║ceho k├│du:


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

─Äalej zme┼łte v s├║bore package.json riadok "start": "node ./bin/www" na "start": "node app.js".

T├Żmto ste presunuli funkcionalitu ./bin/www sp├Ą┼ą do app.js. T├íto zmena sa neodpor├║─Źa, ale toto cvi─Źenie v├ím pom├┤┼że porozumie┼ą ako ./bin/www s├║bor pracuje a pre─Źo app.js u┼ż viac nie je mo┼żn├ę samostatne spusti┼ą.