@LazarchukNazar
Джаваскриптизер

Как обработать ошибку выборки элемента (что делать если элемент не найден)?

Дано:
  • приложение на TypeScript / JavaScript, Node.js
  • база данных (в моем случае SQLite 3, хотя неважно)


Делаю запрос к базе данных
SELECT * FROM companies WHERE id = ?

Если элемент с такое id существует в таблице то мне приходить объект, а если нет то приходит `undefined`.
Как будет правильно в таком случае:
  1. Каждый раз делать проверку на undefined. Т.e:
    const company = await CompanyModel.getById(228);
    if (!company) console.log('Такой компании не существует');


  2. Или выбросить какую-нибудь ошибку и обработать ее (как например 404 в вебе)

    try {
      const company = await CompanyModel.getById(228);
    } catch (err) {
      console.log('Что-то пошло не так!');
      console.error(err); // хз какого типа Error, через какой инстанс его создать?
    }




Я ближе ко второму варианту, как минимум потому что мне всегда придется обрабатывать ошибки любых запросов, так почему бы и не обработать `undefined`.
Так же, как аргумент использование null/undefined это очень плохо, как минимум это усложняет код (например вот пример с книги одного гуру по джаве https://www.yegor256.com/2014/05/13/why-null-is-ba...)
  • Вопрос задан
  • 254 просмотра
Решения вопроса 1
kellas
@kellas
веб-разработчик
Вот так
const company = await CompanyModel.getById(228);
if (!company) throw new Error('Такой компании не существует');

getById не должен выбрасывать исключение если запись не найдена пусть просто возвращает null
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Смотрите тут все просто id генерируется базой и у него есть 5 состояний

существует - просто отдаете
не существует - выводите сообщение мол нет такой записи и пишете в блокнот для возможного бана
удален - сообщаете что пост удален, пользователя в блокнот
доступен вам - просто кидаете ошибку 404, пишете в блокнот
доступен спецслужбам- 404 и репорт спецслужбам
Ответ написан
@LazarchukNazar Автор вопроса
Джаваскриптизер
Вот что у меня получилось в итоге. Вроде всё правильно понял, нет?
import { CompanyDbModel } from 'db/models';
 
class DbRowNotFoundError extends Error {}

// где-то дальше в асинхронной функции
try {
  const company = await CompanyDbModel.getById(228);
} catch (err) {
  if (err instanceof DbRowNotFoundError) {
    return console.log('Поля с таким id в таблице нет');
  }
}
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы