Я использую sequelize в сочетании с react для хранения, обновления и удаления данных в mysql. У меня есть пользователи и некоторые роли. И таблица, в которой хранятся roleId и userId, если у пользователя есть конкретная роль.
Например: у меня есть пользователь, который является Администратором, и я хочу обновить, добавив другую роль (Менеджер), но когда я запускаю код, он добавляет другую запись с roleId роли Администратора, хотя строка с этим roleId и userId уже существует в таблице. В таблицу должно добавляться только дополнительное roleId.
У меня есть группа флажков, которые представляют роли. В данный момент Администратор предварительно отмечен.
Ниже представлен код, который выполняет запрос на добавление roleId и UserId в таблицу:
Object.values(rightsValue).map(value => (
axios.post("http://localhost:3001/userRoles", { RoleId: parseInt(value, 10), UserId: selectedUserIdEdit }).then((response) => {
setShowRightsModal(false);
})
));
rightsValue содержит объект ID ролей, которые отмечены, и я хочу, чтобы они были добавлены в таблицу. Он содержит значение следующее:
[1, 2]
А userId равен: 1
Таким образом, в таблице уже отображается:
RoleId UserId
1 1
Он должен стать:
RoleId UserId
1 1
2 1
Но показывает:
RoleId UserId
1 1
2 1
1 1
Что не должно быть.
Ответ
Для вашей проблемы, когда вы добавляете роли для пользователей в базе данных MySQL с использованием Sequelize и React, вам нужно убедиться, что вы не добавляете дубликаты. Ваша текущая логика добавления записей делает так, что если вы уже имеете запись с определённым RoleId
и UserId
, она будет добавлена снова, что приводит к дублированию.
Вот правильный подход для решения этой проблемы:
-
Проверка на существование записи: Прежде чем добавлять новую запись, вам следует проверить, существует ли запись с такими же
RoleId
иUserId
. Если запись уже существует, просто пропустите добавление. - Изменение вашего API: Вам потребуется добавить логику на стороне сервера, чтобы проверить наличие записи перед добавлением ее в базу данных.
Вот пример, как это сделать:
Серверная часть (Node.js + Sequelize)
const express = require('express');
const { UserRole } = require('./models'); // Импортируйте вашу модель UserRole
const app = express();
app.use(express.json());
app.post('/userRoles', async (req, res) => {
const { RoleId, UserId } = req.body;
try {
// Проверяем, существует ли уже запись с таким RoleId и UserId
const existingRole = await UserRole.findOne({
where: {
RoleId: RoleId,
UserId: UserId
}
});
if (!existingRole) {
// Если не существует, создаем новую запись
const newRole = await UserRole.create({ RoleId, UserId });
return res.status(201).json(newRole);
}
// Если запись уже существует, возвращаем статус 409 (Conflict)
return res.status(409).json({ error: 'Эта роль уже добавлена для данного пользователя.' });
} catch (error) {
console.error(error);
return res.status(500).json({ error: 'Произошла ошибка при добавлении роли.' });
}
});
app.listen(3001, () => {
console.log('Сервер запущен на порту 3001');
});
Клиентская часть (React)
Ваш код для отправки запросов на сервер может остаться почти без изменений, но вы можете обработать ответ, чтобы отобразить сообщение об ошибке, если роль уже существует:
Object.values(rightsValue).map(value => (
axios.post("http://localhost:3001/userRoles", {
RoleId: parseInt(value, 10),
UserId: selectedUserIdEdit
})
.then((response) => {
setShowRightsModal(false);
// Здесь можно обработать успешный ответ, если нужно
})
.catch((error) => {
if (error.response && error.response.status === 409) {
alert('Эта роль уже добавлена для данного пользователя.');
} else {
alert('Произошла ошибка при добавлении роли.');
}
})
));
Этот подход гарантирует, что если вы попытаетесь добавить роль, которая уже существует для данного пользователя, вы не получите дублирующую запись. Вместо этого вы получите уведомление, что роль уже была добавлена.
Убедитесь, что вы также обрабатываете возможные ошибки и уведомляете пользователя о том, если при добавлении возникли проблемы.