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.

Ôťľ

Error handling

Middleware funkcie pre error-handling sa definuj├║ rovnako, ako ostatn├ę middleware funkcie s jedin├Żm rozdielom a to, ┼że maj├║ ┼ítyri argumenty namiesto troch: (err, req, res, next). Napr.:


app.use(function(err, req, res, next) {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

Error-handling middleware zadefinujte ako posledn├Ż, za ostatn├Żmi app.use() a route defin├şciami, napr.:


var bodyParser = require('body-parser');
var methodOverride = require('method-override');

app.use(bodyParser());
app.use(methodOverride());
app.use(function(err, req, res, next) {
  // logic
});

N├ívratov├ę hodnoty pred├ívan├ę medzi jednotliv├Żmi middleware funkciami m├┤┼żu by┼ą v ─żubovo─żnom form├íte, ako napr. str├ínka s HTML errorom, jednoduch├í message, ─Źi JSON string.

Z d├┤vodu lep┼íej organiz├ície k├│du je mo┼żn├ę zadefinova┼ą nieko─żko error-handling middleware funkci├ş, podobne ako je tomu so ┼ítandardn├Żmi middleware funkciami. Napr., ak chcete zadefinova┼ą error-handling pre XHR volania a pre tie ostatn├ę, m├┤┼żete pou┼żi┼ą nasleduj├║ci pr├şklad:


var bodyParser = require('body-parser');
var methodOverride = require('method-override');

app.use(bodyParser());
app.use(methodOverride());
app.use(logErrors);
app.use(clientErrorHandler);
app.use(errorHandler);

V nasleduj├║com pr├şklade logErrors s├║ v┼íetky errory vyp├şsan├ę na stderr, napr.:


function logErrors(err, req, res, next) {
  console.error(err.stack);
  next(err);
}

V nasleduj├║com pr├şklade je clientErrorHandler zadefinovan├Ż tak, aby XHR errory boli explicitne odchyten├ę; tie ostatn├ę sa nespracov├ívaj├║ a ich spracovanie je ponechan├ę nasleduj├║cej middleware funkcii v porad├ş:


function clientErrorHandler(err, req, res, next) {
  if (req.xhr) {
    res.status(500).send({ error: 'Something failed!' });
  } else {
    next(err);
  }
}

Fin├ílna ÔÇťcatch-allÔÇŁ errorHandler funkcia m├┤┼że by┼ą implementovan├í takto:


function errorHandler(err, req, res, next) {
  res.status(500);
  res.render('error', { error: err });
}

Ak do funkcie next() pred├íte ─Źoko─żvek (okrem stringu 'route'), Express bude pova┼żova┼ą toto volanie ako error a automaticky presko─Ź├ş v┼íetky zost├ívaj├║ce non-error middleware funkcie. Ak potrebujete tento error spracova┼ą ┼ípeci├ílne, budete musie┼ą vytvori┼ą error-handling route, ako je pop├şsane v ─Ćal┼íej sekcii.

Ak v├í┼í route handler obsahuje viacero callback funkci├ş, m├┤┼żete k presko─Źeniu na ─Ćal┼í├ş route handler v porad├ş pou┼żi┼ą parameter route. Napr.:


app.get('/a_route_behind_paywall',
  function checkIfPaidSubscriber(req, res, next) {
    if(!req.user.hasPaid) {

      // continue handling this request
      next('route');
    }
  }, function getPaidContent(req, res, next) {
    PaidContent.find(function(err, doc) {
      if(err) return next(err);
      res.json(doc);
    });
  });

V tomto pr├şklade bude getPaidContent handler presko─Źen├Ż, ale ─Ćal┼íie zost├ívaj├║ce app handlery pre /a_route_behind_paywall bud├║ vykonan├ę.

Volania next() a next(err) hovoria, ┼że aktu├ílny handler dokon─Źil svoju ├║lohu pr├şp. v akom stave. Volanie next(err) zabezpe─Źi presko─Źenie v┼íetk├Żch zost├ívaj├║cich handlerov v porad├ş okrem t├Żch, ktor├ę sl├║┼żia na spracovanie errorov, ako je pop├şsan├ę vy┼í┼íie.

Defaultn├Ż Error Handler

Express obsahuje vstavan├Ż error handler, ktor├Ż sa star├í o v┼íetky errory, ak├ę sa m├┤┼żu v aplik├ícii vyskytn├║┼ą. T├íto defaultn├í error-handling middleware funkcia je pridan├í na koniec stacku middleware funkci├ş.

Ak funkcii next() pred├íte error a nespracujete ho vlatn├Żm error handlerom, error bude spracovan├Ż vstavan├Żm error handlerom, pri─Źom error a jeho stack trace bude vr├íten├Ż klientovi. Stack trace nie je vr├íten├Ż v pr├şpade produk─Źn├ęho m├│du.

Ak chcete aplik├íciu spusti┼ą v produk─Źnom m├│de, nastavte environment premenn├║ NODE_ENV na production.

V pr├şpade, ak zavol├íte next() spolu s errorom potom, ako ste u┼ż za─Źali vypisova┼ą response (napr. ak nastane error po─Źas streamovania d├ít klientovi), vstavan├Ż error handler ukon─Ź├ş spojenie s klientom a request spadne.

V pr├şpade, ak m├íte zadefinovan├Ż vlastn├Ż erorr handler a budete chcie┼ą delegova┼ą defaultn├Ż error handling mechanizmus na Express, v pr├şpade ak u┼ż nejak├ę d├íta boli odoslan├ę klientovi, m├┤┼żete vykona┼ą nasledovn├ę:


function errorHandler(err, req, res, next) {
  if (res.headersSent) {
    return next(err);
  }
  res.status(500);
  res.render('error', { error: err });
}