Найдено результатов: 1

Node.js (или другие асинхронные фреймворки): А как отлавливать ошибки?

Вот такой вопрос. Может быть мой задеревенелый синхронный мозг просто не видит решения, которое лежит на поверхности. Но я не понимаю, как обрабатывать ошибки при асинхронном подходе, как выдавать пользователю 500-страницу. Ведь как устроен привычный синхронный запрос (схематично):
try {

  responce = (function request(req) {

    var user = auth.getUser(req);

    if (user.auth) {

      var data = db.getData();

      if (data) {

        return new Responce(template.render(data));

      }

    }

    return error404;

  })(req);

} catch(e) {

  show500(e);

}


Все очень надежно, контроллер обязан возвратить ответ, любые ошибки, не отловленные внутри request, отлавливаются снаружи и выдают пользователю красивую страничку.

Что же при асинхронном подходе node.js?
try {

  (function request(req, res) {

    auth.getUser(req, function(user) {

      if ( ! user.auth) {

        return res.error404();

      }

      db.getData(function(data) {

        if ( ! data) {

          return res.error404();

        }

        res.write(template.render(data));

      });

    });

  })(req, res);

} catch(e) {

  res.show500(e);

}


И вот представте, что где-то в user.auth происходит исключение. Что произойдет? А ничего, function(user) прекратит выполнение, ответ обработать некому, соединение с браузером останется висеть до таймаута. Даже поставив где-то глобальный обработчик ошибок, не удастся вернуть пользователю ответ, потому что в самом объекте исключения нет доступа к объектам запроса и ответа.

Неужели, единственный выход ловить исключения вручную на каждом асинхронном вызове?
try {

  (function request(req, res) {

    auth.getUser(req, function(user) {

      try {

        if ( ! user.auth) {

          return res.error404();

        }

        db.getData(function(data) {

          try {

            if ( ! data) {

              return res.error404();

            }

            res.write(template.render(data));

          } catch(e) {

            res.show500(e);

          }

        });

      } catch(e) {

        res.show500(e);

      }

    });

  })(req, res);

} catch(e) {

  res.show500(e);

}

Node.js   Асинхронное   программирование    

340   6   20:47, 8th August, 2020