Sequelize: SequelizeUniqueConstraintError получает конфликтующую строку

#sql #node.js #sequelize.js

#sql #node.js #sequelize.js

Вопрос:

Я создаю серверную часть, используя Sequelize. Для наилучших практик я хочу вернуть заголовок местоположения, если пользователь пытается создать дублированный ресурс. Проверьте мой код:

 try {
    const resource = await Resource.create(data);
    return res.status(201).send(resource);
} catch (error) {
    // Error handling
    switch (error.name) {
        case 'SequelizeDatabaseError': return res.status(400).send(error);
        case 'SequelizeUniqueConstraintError': {
          // Resource location
          res.location(`/${_location_}`)
          return res.status(409).send(_resource_)
        };
    }
  

Obs: Я не уверен, что проверка error.name — лучший способ получить ошибку. Пожалуйста, прокомментируйте других, если вы знаете.

Распечатав ошибку на консоли, я обнаружил подробности ошибки:

 {
    // ...
    ValidationErrorItem {
        message: 'name must be unique',
        type: 'unique violation',
        path: 'name',
        value: _value_,
        origin: 'DB',
        instance: [Resource],
        validatorKey: 'not_unique',
        validatorName: null,
        validatorArgs: []
      }
    ],
    fields: { name: _value_ },
    detail: 'Key (name)=(_value_) already exists.',
    // ...
}
  

Obs: _value_ ссылается на дублированное значение и name на имя столбца.

Есть способ получить идентификатор (первичный ключ, uuid и т.д.) конфликтующего ресурса без выполнения другого запроса? Если нет, должен ли я действительно выполнить запрос только для возврата параметра заголовка местоположения?

Ответ №1:

Я также попробовал это на своем локальном сервере. Я не думаю, что возможно получить первичный ключ конфликтующей строки.

Я бы посоветовал перед .create() вызовом сделать .findOne() запрос, поэтому, если вы нашли уже существующую запись, вы можете вернуть эту строку, чтобы это также предотвратило ошибку при создании новой записи, а также сохранило create запрос в базе данных.