0

У меня есть специальный чехол, для которого я хочу очистить возможную причину ошибки 503. Следующий фрагмент кода имеет заявление улова, который работает, когда система не может найти какие-либо результатыОбработка ошибки 503 в Express/Node.js, особенно в случае TryCatch

app.post('/api/fetch/user', function(req, res){ 
    var email = req.body.emailTxt; 
    db.one('SELECT * FROM users WHERE email=$1', [email]) 
     .then(function(data){ 
      console.log('DATA:', data); 

      var userCard = { id: data.user_id, name: data.user_name, 
          email: data.email, regDate: data.date_created }; 

      res.status(200).json({ 'valid': true, '_payload': userCard }); 
     }) 
     .catch(function(error){ 
      if(error.search(/No data returned from the query/im) > 0) // regex case insensitive search and search multiline as source string is multiline 
       res.status(500).send('Invalid Request Match'); 
      else 
       res.status(500).send('ERROR: '+error); 
     })   

});

Когда мой API вызов сделан с этой целью API точки и когда результат не нашел ходы управления в catch(), который хорошо, но довольно странно он возвращает 503 - Request timeout ошибки. Я попытался удалить условия в if(), чтобы отлаживать, но похоже, что неважно, но if-else не работает в ExpressJs.

Примечание: все работает хорошо, а также когда управление остается в .then(). Если я удалю if,else и сохраняю сообщение об ошибке/ответе ошибки, все работает нормально. В моем API нет ничего особенного; это всего лишь один сценарий, который я подготовил для тестирования API.

ответ

1

Я думаю, что вы получили ошибку в блоке .catch.

Попробуйте изменить код и посмотреть, если это помогает:

app.post('/api/fetch/user', function(req, res){ 
    var email = req.body.emailTxt; 
    db.one('SELECT * FROM users WHERE email=$1', [email]) 
     .then(function(data){ 
      console.log('DATA:', data); 

      var userCard = { id: data.user_id, name: data.user_name, 
           email: data.email, regDate: data.date_created }; 

      res.status(200).json({ 'valid': true, '_payload': userCard }); 
     }) 
     .catch(function(error){ 
      console.error(error); //never ignore errors! 
      try { 
      //i think error is an Error Object here, so it doesn't have .search function 
      if(error.search(/No data returned from the query/im) > 0) // regex case insensitive search and search multiline as source string is multiline 
       res.status(500).send('Invalid Request Match'); 
      else 
       res.status(500).send('ERROR: '+error); 
      } catch (err) { 
      console.error(err); 
       res.status(500).send('some unknown error'); 
      }; 
     }); 
     }); 
  1. Edit: К сожалению, удалили .finally, потому что вы можете отправить ответ дважды.

  2. Редактировать, лучший подход к обработке ошибки в .catch блок.


//make catch block error safe to make sure no error occurs 
if (error && error.message == 'No data returned from the query.') { 
    res.status(500).send('Invalid Request Match'); 
} else { 
    res.status(500).send('ERROR: '+error); 
} 
+0

Одна опечатка, хотя, 'catch' вы упомянули не принимает функцию и позволяет только передать параметр. Да, вы указали на правильное направление, что 'error' не имеет' .search() '. Что делать в этом случае, если я хочу проанализировать строку сообщения об ошибке? Ошибка отображается на консоли (в многострочной) следующим образом: 'ERROR: QueryResultError { code: queryResultErrorCode.noData сообщение:« Нет данных, возвращаемых из запроса." получено: 0 запрос:" SELECT * FROM users WHERE email='[email protected] 'И password =' ​​1234 '" }' –

+0

Hurrey !! решил проблему в соответствии с вашими указаниями. Разберитесь с ошибкой 'error 'object to string using' error.toString(); 'поскольку' .toString() 'является глобальным методом, и это сработало для меня. –

+0

Так как ваша база данных возвращает правильный' QueryResultError', я думаю, вы можете сделать его безопасным в блок 'catch'. Отредактирован ответ с лучшим подходом к обработке ошибок. – iKoala

0

Мы используем коды ответа в ExpressJs довольно интенсивно при создании службы API. Поэтому нам кажется правильным, что мы используем их напрямую, а не делаем if-else в catch().

Таким образом, правильный путь будет:

.catch(function(error){ 
     console.log('ERROR:', error); 
     res.status(204).send('No Content; Invalid Request Match'); 
    }) 

Однако, если вы хотите отобразить/вернуть подробное сообщение, которое вы можете сделать это, как хорошо. Вы можете проверить: http://expressjs.com/en/api.html#res для получения более подробной информации о способах ответа. Вы можете отобразить HTML-шаблон или вернуть ответ JSON или даже многострочный текст.

Не знаю, почему if-else создает проблему, но вы можете пойти другим путем.

В вашем конкретном случае error не прилагает к нему .search(). Так что лучше разобрать его, чтобы начать сначала, используя .toString();.

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