Node.js / Express - ошибка рендеринга, когда страница не найдена - PullRequest
25 голосов
/ 04 октября 2011

У меня есть следующее определение контроллера / маршрута в Node.js (с использованием Express и Mongoose).Что было бы самым подходящим способом обработки ошибок, когда пользователь запрашивает несуществующую страницу?

  app.get('/page/:pagetitle', function(req, res) {
      Page.findOne({ title: req.params.pagetitle}, function(error, page) {
          res.render('pages/page_show.ejs',
            { locals: {
                title: 'ClrTouch | ' + page.title,
                page:page
            }
          });
      });
  });

В настоящее время это ломает мое приложение.Я верю, потому что я ничего не делаю с ошибкой, я просто передаю ее в виде успеха?

TypeError: Cannot read property 'title' of null

Большое спасибо.

Ответы [ 2 ]

48 голосов
/ 04 октября 2011

Посмотрите на экспресс error-pages пример. Принцип состоит в том, чтобы сначала зарегистрировать маршруты вашего приложения, а затем зарегистрировать обработчик catch all 404 для всех других запросов, которые не отображаются на маршрут. Наконец, обработчик 500 регистрируется следующим образом:

// "app.router" positions our routes 
// specifically above the middleware
// assigned below

app.use(app.router);

// Since this is the last non-error-handling
// middleware use()d, we assume 404, as nothing else
// responded.

app.use(function(req, res, next){
  // the status option, or res.statusCode = 404
  // are equivalent, however with the option we
  // get the "status" local available as well
  res.render('404', { status: 404, url: req.url });
});

// error-handling middleware, take the same form
// as regular middleware, however they require an
// arity of 4, aka the signature (err, req, res, next).
// when connect has an error, it will invoke ONLY error-handling
// middleware.

// If we were to next() here any remaining non-error-handling
// middleware would then be executed, or if we next(err) to
// continue passing the error, only error-handling middleware
// would remain being executed, however here
// we simply respond with an error page.


app.use(function(err, req, res, next){
  // we may use properties of the error object
  // here and next(err) appropriately, or if
  // we possibly recovered from the error, simply next().
  res.render('500', {
      status: err.status || 500
    , error: err
  });
});
3 голосов
/ 04 октября 2011

Одна из основных проблем Node.JS заключается в том, что нет чистого перехвата ошибок.Обычный способ обычно применяется для каждой функции обратного вызова, первый аргумент - не ноль, если есть ошибка, например:

function( error, page ){
   if( error != null ){
       showErrorPage( error, req, res );
       return;
   }
   ...Page exists...
}

Вещи могут стать некрасивыми через некоторое время при слишком большом количестве обратных вызовов, и ярекомендуем использовать что-то вроде async , чтобы при возникновении одной ошибки она сразу переходила к обратному вызову ошибки.

EDIT: вы также можете использовать экспресс-обработку ошибок .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...