coub css express.js freeware git jquery laravel links linux macos mysql node.js php PostgreSQL python task1 ubuntu vim virtualbox анекдот игры интересно музыка стихи цитаты

Express.js error handing March 22, 2013
Поднобные объяснения на английском можно почитать вот тут. Суть в том, что в express.js метод передачи ошибок несколько отличается. Лично мне пока не очень понятно почему так, но инженер который собственно и разрабатывает express.js выбрал такой путь. Наверное с точки зрения идеологии node.js и асинхронного программирования вообще - это правильно (именно передавать ошибки по цепочке, а не ловить их), но мне на данный момент кажется что это несколько кривовато. Если пойму со временем в чем смысл именно такого подхода, то допишу подробнее или исправлю запись.

Обычно в node.js exception-ы ловятся по-человечески, то есть вот так
app.get('/home', function(req, res){
    // ошибка
    throw new Error('error text msg');
});
В случае с express.js схема работы такая
app.get('/home', function(req, res, next){
    // ошибка
    next(new Error('error text msg'));
});
Причем интересно, что в таком простом примере в express.js вполне сработает и первый вариант, но вот пример ниже уже работать не будет. Насколько я понял дело в том что выкинули общий хэндлер ошибок app.error(function(err,...)). Честно говоря причин такого решения я пока не нашел.
app.get('/home', function(req, res, next){
  db.getRow("SELECT * FROM ...", function(err, row){
    throw new Error('error text msg');
  });
});
В этом случае ошибка просвистит мимо и приложение завалится. Православный путь на данный момент — таскать все ошибки по цепочке вручную. Писанины к сожалению получается несколько больше, но вполне вписывается в предусмотренную схему. Неудобно, но пока найдется что-то повеселее - это рабочее решение. Надо будет собраться написать Tj на эту тему.

Как управлять ошибками в express.js сейчас.
./app.js
app.configure(function(){
  //.. здесь вся остальная необходимая конфигурация

  // error 500
  app.use(function(err, req, res, next) {
    res.status(500).render('err500', {
      title: 'ouch.. 500 error',
      err: err
    });
  });
});

// "контроллер" блога
var blog = require('./routes/blog');
// роут на конкретную операцию
app.get('/post/:post_id', blog.blogPost);
./routes/blog
// ... остальное содержимое контроллера
exports.blogPost = function(req, res, next)
{
  // .. проверки что-то ещё
  db.getRow("SEL33ECT b.* \
    FROM blog b \
    WHERE blog_id=?",
    [
      post_id
    ], function(err, post){
      // ловим ошибку
      if (err) {
        return next(err);
      }

      // тут что-то дальше происходит
      // ...
  });
};
express.js node.js

Comments

No comments here yet.
You have to login to post a new comment.
Want this blog? Checkout that  here