Тема: Node.JS + MongoDB
Показать сообщение отдельно
Старый 03.09.2013, 13:53   #6
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Node.JS + MongoDB

Сообщение от pax Посмотреть сообщение
1. Как правильно обрабатывать ошибки, чтобы при их происхождении не падал весь процесс. Можно конкретно для express и mongodb.
В примерах я делал 'throw', обычно я так не делаю.
Важно понимать что ошибки - это важно, и их не должно быть.
Если в тестировании ошибок в запросах к бд небыло, а потом есть, значит твой query слишком динамичен и нужно его немного нормализировать (это 90% случаев).
Я у себя в коде так делаю:

Ранее при настройке express'а:
app.configure(function() {
  
app.use(express.errorHandler());
  ...
}); 
app.get('/users', ..., function(reqresnext) {
  
users.find({ }, { skipreq.paginator.skiplimitreq.paginator.limit }).toArray(function(errdata) {
     if (!
err) {
       
res.json(data);
     } else {
       
next(err);
     }
  });
}); 
Далее где-то в коде самый последний middleware будет для ловли ошибок:

app.use(function(errreqresnext) {
  var 
obj = {
    
errortrue,
    
messageerr.message
  
};
  if (
development) {
    
obj.stackerr.stack;
  }
  
res.json(obj);
}); 


Сообщение от pax Посмотреть сообщение
2. Я так понимаю что кластер можно использовать как защиту от падения процесса, т.е. кластер при падении одного воркера может запустить нового воркера? И если надо будет перезапустить сервер, то просто необходимо будет перезапустить кластер да?
Да. Но нужно следить точно когда что-то падает или нет.
Вообще есть "защито" от падения процесса. Есть event который ловит не словленные exception'ы. Но естественно если что-то жесть как пошло не так, то нужно и реагировать соответственно, а не тупо игнорировать.
Но всё равно:

process.on('uncaughtException', function(err) {
  
console.log('Caught exception: ' errerr.stack);
}); 


Сообщение от pax Посмотреть сообщение
3. Какой модуль лучше использовать для логирования? Особенно если используется кластер и несколько воркеров.
Я пока настраивал node.js как сервис в linux, тупо выводил консоль в файл, естественно это не супер решение. И исследовал этот вопрос. Лидер тут конкретный: winston https://github.com/flatiron/winston , отлично поддерживается.
Суть у него в том что он имеет основу для логгирования, но логит в транспорты, которые могут быть что угодно: консоль, файл, бд, MQ, redis, socket, amazon alerts, email, и т.п.
Есть стандартный набор транспортов которых обычно хватает с головой.

Я лично юзать буду файл + бд (с индексом просрочивания неделю), и ZeroMQ в мелкий процесс который через socket.io будет слать логи от разных процессов мне на мелкую страничку мониторинга. Таким образом если что-то случиться, я сразу могу вычислить с кем, где и т.п.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
pax (03.09.2013), SpiritSound (28.11.2015)