Node.js — как обрабатывать события ошибок потока

Я читаю из файлового потока, возвращенного из fs.createReadStream(), и передаю его в поток gzip, созданный с помощью zlib.createGzip(), а затем передаю поток gzip в ответ HTTP.

Я не уверен, как справиться с событием «ошибка» в этих потоках. Я просто хочу убедиться, что все потоки закрываются, что ошибка регистрируется и что никакие ресурсы не утекают (обратите внимание, что для файлового потока значение autoClose равно true).

Если ошибка произойдет, например, в потоке чтения fs, как это повлияет на поток gzip, а затем на поток ответов? Будет ли событие «ошибка» распространяться автоматически или оно просто не будет обработано и приведет к сбою моего приложения? Должен ли я прослушивать событие «ошибка» в каждом из потоков или только в последнем потоке в цепочке? Что произойдет, если я прослушаю «ошибку» в потоке fs. Обнаружит ли поток gzip, что произошла ошибка?


person Jon    schedule 19.11.2013    source источник


Ответы (1)


Ошибки из одного потока в другой не распространяются по конвейеру, поэтому вы должны прикрепить прослушиватели ошибок к обоим потокам.

Если поток чтения fs имеет ошибку, если autoClose имеет значение true, то он будет уничтожен (он очистит и закроет файловый дескриптор). Но поток gzip не будет закрыт, поэтому вам придется закрыть его вручную.

Если у gzip есть ошибка, он просто выдаст ее. Он не будет закрыт, и читаемый поток не будет.

Глядя на другие потоки, такие как поток записи fs, если при записи произойдет ошибка, то он закроет поток для записи, но поток для чтения останется открытым.

Поэтому я рекомендую установить обработчик ошибок для всех ваших потоков и не полагаться на то, что они закроются при ошибке, поэтому вызывайте .close или .destroy для всех ошибок.

Чтобы убедиться, что вы прослушиваете все обработчики ошибок, используйте домены.

person Farid Nouri Neshat    schedule 05.02.2014