#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
запрос в базе данных.