Я новичок в базах данных NodeJS и Mysql. Я делаю небольшой проект в React с бэкэндом. Это недельный календарь, в котором студенты смогут бронировать уроки. Сейчас я делаю панель администратора, где учитель может создать недельный календарь с выбранными доступными часами. Все выбранные часы собраны в состояние, и выглядят они так:
[
{year: '2023', user_uuid: 2, dayId: 2, hourId: 0, hour: '7:00'}
{year: '2023', user_uuid: 2, dayId: 5, hourId: 0, hour: '7:00'}
{year: '2023', user_uuid: 2, dayId: 4, hourId: 0, hour: '7:00'}
{year: '2023', user_uuid: 2, dayId: 4, hourId: 1, hour: '7:45'}
etc.]
Что я пытаюсь сделать, так это отправить это состояние в мою таблицу в базе данных Mysql. Я создал бэкэнд в NodeJS, и он выглядит так:
(Код отредактирован с учетом предложений демонхолдена).
const express = require("express");
const mysql = require("mysql");
const cors = require("cors")
const app = express();
const db = mysql.createConnection({
host: "localhost",
user: "root",
password: "",
database: "meetapp"
})
app.use(express.json())
app.use(cors())
app.get("/", (req, res) =>{
res.json("hello this is the backend")
})
app.post("/terms", (req, res) => {
const q = "INSERT INTO terms (year, user_uuid, dayId,
hourId, hour) VALUES ?"
const bulkValues = req.body.map((values) => [
values.year,
values.user_uuid,
values.dayId,
values.hourId,
values.hour,
]);
console.info('bulk is', bulkValues)
db.query(q, [bulkValues], (err, data) => {
if (err) return res.json(err)
return res.json(data)
})
app.listen(8801, () => {
console.info(`Backend works! Listening on 8801`);
});
А это моя пост-функция в коде React:
const saveWeek = async e => {
e.preventDefault()
try {
await axios.post("http://localhost:8801/terms", sortedTerms)
} catch (err) {
console.info(err)
}
}
«sortedTerms» — это состояние со всеми собранными часовыми данными, о которых я упоминал выше. Когда я запускаю функцию onClick saveWeek, она отправляет все собранные данные в серверную часть. Журнал консоли в бэкэнде показывает следующее:
bulk is [
[ '2023', 2, 0, 0, '7:00' ],
[ '2023', 2, 1, 0, '7:00' ],
[ '2023', 2, 2, 0, '7:00' ],
[ '2023', 2, 3, 0, '7:00' ],
[ '2023', 2, 3, 1, '7:45' ],
[ '2023', 2, 3, 2, '8:30' ],
[ '2023', 2, 6, 20, '22:00' ],
[ '2023', 2, 5, 20, '22:00' ]
]
Обновлено: я использовал предложение демонхолдена, и теперь код работает нормально. Он сохраняет все данные в базу данных mysql. Надеюсь, это будет полезно для других разработчиков.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если вы отправляете весь массив в почтовом запросе, вам нужно будет указать позицию индекса в назначении values в вашем почтовом маршруте Express '/terms':
const values = [
req.body[0].year,
req.body[0].user_uuid,
req.body[0].dayId,
req.body[0].hourId,
req.body[0].hour,
];
В качестве альтернативы просто отправьте один объект в запросе Axios:
axios.post('http://localhost:8801/terms', sortedTerms[0]);
Однако, если вы хотите выполнить массовую вставку всего массива, вам нужно будет сопоставить req.body с массивом массивов, где каждый подмассив содержит значения каждой записи, и присвоить массив values:
const bulkValues = req.body.map((values) => [
values.year,
values.user_uuid,
values.dayId,
values.hourId,
values.hour,
]);
Надеюсь это поможет.
Я изменил ответ, чтобы учесть это.
Еще раз спасибо, Деймон, я думаю, что мы почти у цели :) Я исправил свой код, и прямо сейчас он отправляет все данные в серверную часть (журнал консоли видит данные), но они не сохраняются и не видны в базе данных mysql. Я отредактировал код выше, чтобы вы могли увидеть мой фактический код с вашими предложениями. Все еще чего-то не хватает? Может что-то с запросом db.query?
Я исправил эту вставку ("ВСТАВИТЬ В термины (год, user_uuid, dayId, hourId, час) ЗНАЧЕНИЯ?"), и теперь все работает нормально. Данные сохраняются в базе данных mysql.
рад, что вы разобрались. Рад был помочь.
Спасибо за быстрый ответ. Это вроде как работает, прямо сейчас код сохраняет в моей базе данных первый объект в массиве (раньше я получал только null, теперь он сохраняет полный объект). Но как я могу сохранить все объекты? Один под другим?