2016-12-15 3 views
1

При возникновении ошибки в приложении NodeJS сервер может выходить из строя и останавливаться, если возникает исключение.NodeJS: предотвращение сбоя приложения при ошибке

Как предотвратить эту ситуацию, чтобы сервер никогда не останавливался при ошибке, а вместо этого возвращал код ошибки?

- EDIT

Вот метод, который вызывает сбой сервера (таблица Foo не существует):

app.get('/articles/list', function(req, res) { 
    connection.query('select * from foo', function(err, rows, fields) { 
     if (err) throw err; 
     res.send(JSON.stringify(rows)); 
    }); 
}); 

- ЛУЧШЕЕ РЕШЕНИЕ Наконец, я нашел лучшее решение для я: http://rowanmanning.com/posts/node-cluster-and-express/

в целом, она заключается в использовании кластера сервера и перезапустить сервер, когда он выходит из

+0

это кажется немного расплывчатым, вы всегда можете добавить попытку поймать в критической области – dege

ответ

0

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

Для ошибок: с помощью try-catch о

Для обещаний: используя .catch метод

Btw Node позволяет вам перехватить uncaughtExceptions или unhandledRejection события, но это не очень хорошая практика для обработки ошибок в этот уровень и предотвращать выходы программы, поскольку они могут генерировать непредсказуемое поведение.

-1

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

try{ 
     //youre code here 
    }catch(error){ 
     console.log(error) 
    } 
1

Если вы используете express, вы можете использовать этот

function clientErrorHandler (err, req, res, next) { 
    if (req.xhr) { 
     res.status(500).send({ error: 'Something failed!' }) 
    } else { 
     next(err) 
    } 
} 

app.use(clientErrorHandler); 

Я предлагаю вам готов это article, это многое прояснит для вас. JFK, помните об обнаружении ошибки async, наиболее распространенной ошибке, когда у вас есть асинхронный файл, который завернут в try-catch. Кроме того, избегайте использования

process.on("uncaughException",() => {....}) 

Это очень плохо, потому что, когда неперехваченное исключение вы не можете надежно продолжать свою программу на этом point.Let он не в состоянии и перезапустить daemonizer's как pm2, forever и т.д.

+0

Спасибо за ваш ответ. Я использую выражение действительно, но clientErrorHandler не работает для меня (я отредактировал свой вопрос, чтобы вставить образец кода) – hadf

+0

@hadf Обновленный ответ, ответ не был заполнен. В любом случае, ваше приложение разбито, потому что вы просто перебрасываете ошибку, которая не обрабатывается нигде. if (err) { res.status (500) .send (новая ошибка (ошибка)); } –

+0

Спасибо, я нашел лучшее решение для меня. Он состоит в использовании кластера для повторного запуска сервера узла при его сбоях – hadf

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