2014-01-15 7 views
1

Я пытаюсь использовать различные методы обработки ошибок с помощью Express. Сначала я просто использовал process.on('uncaughtException'). Я быстро понял, что это плохая практика. После этого я попытался использовать новую функцию «Домен» в узле js. Однако я завернул каждый запрос в домене, если бы я отправил ответ, а затем выполнил еще некоторую работу на сервере (имея дело с одним и тем же запросом), он не поймал бы ошибки этих функций после отправки ответа. Затем я попытался перейти к встроенной обработке ошибок с помощью Express, используя next(err). Однако я сталкиваюсь с той же ситуацией. Если я отправлю ответ, а затем функция имеет ошибку после отправки ответа, мой обработчик ошибок не будет вызван. Вот пример кода.Обработка ошибок в Express JS после ответа

async.waterfall([ 
     function(after) 
     { 
      hashPassword(password, after); 
     }, 
     function(hash, after) 
     { 
      makeToken(hash, after); 
     }, 
     function(hash, token, after) 
     { 
      insertUserInfo(email, username, hash, ip, token, after); 
     }, 
     function(token, id, after) 
     { 
      req.session.attempts = 0; 
      res.json({ err: 0, attempts: 0 }); //Response is sent 
      after(null, token, id); 
     }, 
     function(token, id, after) 
     { 
      sendEmail(token, email, renderEmail); //Errors not caught 
      makeFolder(id, after); //Errors not caught 
     } 
    ], function(err) { 

     if(err) 
      next(err); 

    } 
); 

Как вы можете видеть из кода, я регистрирую нового пользователя. Теперь я мог подождать, пока не закончу всю свою логику, чтобы отправить ответ, но я подумал, что это сделает запрос намного быстрее для пользователя, если я сделал некоторые из менее важных вещей после отправки ответа. Я готов изменить свой код, чтобы выполнить все ТОГДА отправьте ответ, но я хочу убедиться, что нет решения, которое я еще не пробовал.

ответ

0

Как удивительно, как Express JS, у него нет функции путешествия по времени, позволяющей отменить запрос :) Это действительно корень вашей проблемы. Если ваш ответ должен отобразить результат, тогда он должен дождаться завершения всех соответствующих действий.

+0

Спасибо за ваш ответ! Я согласен с тем, что я пытаюсь срезать углы, отправляя ответ преждевременно. Однако, когда я отправляю ответ, я уже выполнил все, на что пользователь мог вводить данные, поэтому больше нет ошибок для их отображения. Мне просто было интересно зафиксировать эти ошибки для моего журнала, чтобы я мог обнаружить любые проблемы, если они произойдут. Я вижу, как это выглядит так, как будто я спрашиваю много Express, но мне было просто любопытно узнать, существует ли решение. – jfizz

+0

Я вижу. Если я правильно понял, вы не могли бы вызвать next(), чтобы сигнализировать Экспресс, что вы закончили, и это конец этого вопроса в отношении пользователя. Но это не означает, что вы не можете прослушивать события ошибки, которые срабатывают долго после того, как Express отправил запрос. Вместо вызова done (err) эти прослушиватели событий могут выполнять ведение журнала и т. Д. Или даже отправлять по электронной почте пользователю. Или я лаяю неправильное дерево? – greim

+0

Это правда. Я мог бы создать еще одну систему обработки ошибок, которая имеет дело с ошибками после ответа, но у меня больше не будет объекта запроса для сбора сведений о пользователе при регистрации моей ошибки, и я не смог бы использовать 'next()' , Я предполагаю, что в любом случае я не буду делать то, что я хочу сделать после отправки ответа. – jfizz

Смежные вопросы