обработка ошибок в асинхронных вызовах node.js

Я новичок в node.js, хотя в целом хорошо знаком с JavaScript. Мой вопрос касается «лучших практик» по обработке ошибок в node.js.

Обычно при программировании веб-серверов, серверов FastCGI или веб-страниц на разных языках я использую Исключения с обработчиками блокировки в многопоточной среде. Когда приходит запрос, я обычно делаю что-то вроде этого:

function handleRequest(request, response) {
  try {

    if (request.url=="whatever")
      handleWhateverRequest(request, response);
    else
      throw new Error("404 not found");

  } catch (e) {
    response.writeHead(500, {'Content-Type': 'text/plain'});
    response.end("Server error: "+e.message);
  }
}

function handleWhateverRequest(request, response) {
  if (something) 
    throw new Error("something bad happened");
  Response.end("OK");
}

Таким образом я всегда могу обработать внутренние ошибки и отправить действительный ответ пользователю. Моя проблема здесь в том, что я больше не могу использовать одну попытку / поймать и, следовательно, обычно не могу поймать какую-либо ошибку, которая может возникнуть во время обработки запроса.

Конечно, я мог бы добавить try / catch в каждый обратный вызов, но мне не нравится этот подход, потому что тогда программист должен не забыть try / catch. Для сложного сервера с множеством различных и сложных обработчиков это неприемлемо.

Я мог бы использовать глобальный обработчик исключений (предотвращающий полный сбой сервера), но тогда я не могу отправить ответ пользователю, так как я этого не делаю. не знаю, какой запрос привел к исключению. Это также означает, что запрос остается необработанным / открытым и браузер вечно ждет ответа.

Есть ли у кого-то хорошие, твердое решение?

45
задан ThiefMaster 30 May 2012 в 20:01
поделиться