Задать вопрос
WhatIsHTML
@WhatIsHTML
HTML программист

Как правильно отправить sql ошибку клиенту?

Всем привет. Под рукой NodeJs, Express, PostgreSql, pg-promise
Возник вопрос о том, как правильно отлавливать и отправлять sql ошибку на клиент.
Если SQL запрос не удался, например из-за того, что ключ уже используется, то все ок, получаю ошибку и могу отправить ее на клиент. Но что-то мне подсказывает, что в исходном виде отправлять ее нежелательно и это как минимум не user-friendly. Как по-хорошему это делается? Может есть какие-то npm пакеты, которые парсят код SQL ошибки и отдают читабельную краткую информацию? Или самому разбирать?

В моем случае есть запрос
self.updateInfo = function (user) {
   return db.query("UPDATE users SET name=${name}, username=${username}, email=${email} WHERE (id=${id} AND activated = true) RETURNING *;", user);
    }

В контроллере обычный then/catch
userSQL.updateInfo(user).then(function (newUser) {
    response.json({
      message: "user updated",
      data: newUser
    });
  }).catch(function (error) {
    handler.error(response, 400, error);
  });


Пример SQL ошибки которую получаю

{"message":{"name":"error","length":305,"severity":"ОШИБКА","code":"23505","detail":"Ключ \"(username)=(test)\" уже существует.","schema":"public","table":"users","constraint":"users_username_key","file":"nbtinsert.c","line":"434","routine":"_bt_check_unique"}}
  • Вопрос задан
  • 148 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
Melkij
@Melkij
PostgreSQL DBA
А зачем вообще отправлять ошибку запроса на клиент?
Ошибке запроса самое место в логе и только там. Клиенту - HTTP 500 и "извините, не шмогла" написанное любым вариантом какой вам понравится.
Если требуется другое сообщение (или действие) для конкретной ошибки - ловите этот конкретный код ошибки. На допустимость логина обычно проверяют предварительным запросом, в апдейт on conflict пока не завезли. Плюс можно хапнуть advisory lock для устранения race condition и закатать всё в одну хранимку чтобы сэкономить на планировщике и сети.
Ответ написан
@d-stream
Готовые решения - не подаю, но...
Нормальный вариант - не делать селекты, а вызывать stored procedures, которые на базовом уровне проверяют логическую (бизнес) консистентность данных и выводят user friendly отлуп в виде "такой код уже используется", "невозможно списать со счета клиента сумму хх, потому что на его счету недостаточно средств", "для выполнения данной операции недостаточно прав" и все "непредсказуемые" оборачивая в try catch - вываливать уже как 500 или что-то подобное "произошла системная ошибка, сообщите разработчикам. подробности: ...." (ну или писать в лог)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы