Подтвердить что ты не робот

Рекомендации по устранению исключений в SailsJS

Я только что начал проверять SailsJS несколько дней назад.
Я понял, что Node завершается всякий раз, когда у меня есть неперехваченное исключение.
У меня есть список контроллеров, и каждый из них вызывает определенный JS файл службы (содержащий логику и вызовы БД) в сервисах /.
Могу ли я написать глобальный обработчик ошибок для всех служб, чтобы любой тип ошибок, возникающих из этих служб, должен обрабатываться им, и соответствующий ответ об ошибке должен быть передан интерфейсу.

Я попытался использовать process.on('uncaughtexception') или некоторые основные исключения, но его нужно добавить к каждому методу службы.

Также у меня есть одна общая точка для всех вызовов службы, сделанных от клиента к серверу, через который проходят все io.socket.post() и io..socket.get() через

Я был бы признателен за любой указатель/статью, которая показала бы мне общие рекомендации по обработке исключенных исключений в SailsJS и использованию более короткого кода вместо написания избыточного кода во всех сервисах.

4b9b3361

Ответ 1

Лучшая практика заключается в использовании Доменов в вашем контроллере. Это будет обрабатывать исключения в асинхронном коде и относительно прямо вперед.

Вы можете использовать что-то вроде trycatch, чтобы немного упростить, но исключения на основе доменов будут наиболее эффективными. Это гарантирует, что исключения не сбой приложения. Просто создайте новый домен в своем контроллере и запустите свои методы управления внутри этого домена.

Sailsjs, основанный на выражении, вы можете использовать связующее ПО, и вы можете легко создать новый домен из промежуточного программного обеспечения. Там есть express-domain-middleware. Это может быть самым эстетичным вариантом и наиболее удобным.

Update: Как упоминает Бенджамин Груэнбаум, домены должны устаревать в версии 1 node. Возможно, вам стоит прочитать Joyents Error Handling Best практика. Его агностик к используемой структуре.

Кроме того, вы все равно можете использовать Домены, в то время как нет способа глобально обрабатывать ошибки в node.js в противном случае. После устаревания вы всегда можете легко удалить свою зависимость от Доменов. Тем не менее, лучше не полагаться исключительно на домены.

Strongloop также предоставляет библиотеку, вдохновленную доменами Zone. Это также вариант.

Ответ 2

Его ОК, чтобы ошибка экземпляра node из-за ошибки программирования, иначе она может продолжаться в противоречивом состоянии и беспорядочной бизнес-логике. В производственной среде сервер может быть перезапущен при сбое, это будет reset его состояние и сохранить его доступным, если ошибка не частая. И во всем этом очень важно регистрировать все. Это относится к большинству настроек node, включая SailsJS.

Можно использовать следующий подход:

  • Использовать регистратор: выделенный сервер должен быть доступен для компонентов сервера. Должен быть подключен к службе, которая уведомляет разработчика (электронную почту?) О очень серьезных ошибках.
  • Продвигайте ошибки каждого запроса до конца: аккуратно отправляйте ошибки с любого шага обработки запроса. В настройках ExperssJs/ConnectJs/middleware, next(err) может использоваться для передачи ошибки в цепочку среднего уровня. Ошибка, улавливающая среднее изделие в конце цепочки, получит эту ошибку, запишет ее в verbose и вернет статус 500. Вы можете использовать Domains или Zones или Promises или async или все, что хотите обработать запрос и уловить ошибки.
  • Завершение работы на process.on('uncaughtexception'): зарегистрируйте erorr, выполните необходимую очистку и повторите ту же ошибку для завершения процесса.
  • Пользователь PM2/Forever или Upstart/init.d на linux: теперь, когда процесс завершается из-за плохого исключения, эти инструменты перезапускают его и отслеживают, сколько раз сервер времени сбой. Если сервер рушится слишком много раз, полезно прекратить его и принять немедленные меры.

Ответ 3

Я не пробовал это, но я считаю, что вы должны установить обработчик исключений catch-all в bootstrap.js, используя process.on('uncaughtexception').

Лично я использую promises через библиотеку bluebird и помещаю оператор catch, который передает все ошибки в глобальную обработку ошибок функция.