В настоящее время я пытаюсь выполнить итерацию для массива объектов, которые необходимо вставить в зависимости от количества элементов в массиве (из request.body).
Ожидаемое поведение:
Я думал, что цикл for приведет к различным SQL-запросам секвелирования, которые будут вставляться в базу данных один за другим.
-
Фактическое поведение:
Фактическое поведение заключается в том, что в базу данных вставляется только последний элемент массива, а первый перезаписывается и не вставляется в базу данных.
-
Мой вопрос:
Как изменить эту существующую логику, чтобы иметь возможность вставлять несколько записей в базу данных при использовании транзакций / секвелирования SQL-запросов?
Данные, которые я отправляю в запрос API:
[{
"venue_id": 5,
"event_id": 13,
"table_id": 4,
"date_in": "2017-11-30",
"date_out": "2017-12-31",
"check_in": "2017-12-31T17:04:42.333Z",
"check_out": "2017-12-31T17:05:42.333Z"
},
{
"venue_id": 6,
"event_id": 18,
"table_id": 6,
"date_in": "2017-11-30",
"date_out": "2017-12-31",
"check_in": "2017-12-31T17:04:42.333Z",
"check_out": "2017-12-31T17:05:42.333Z"
}]
Логика вызовов API приведена ниже. Этот запрос API в основном выполняет следующие действия:
- Запускает транзакцию SQL для фиксации или отката в случае сбоя.
- Выполняет поиск идентификатора места проведения, идентификатора клиента и идентификатора таблицы. (на случай, если кто-то попытается вставить несколько несуществующих идентификаторов)
- Рассчитывает стоимость столов вместе
- Создает бронирование
- Подтверждает транзакцию и возвращает ответ.
router.post(
"/api/v1/reservations",
[passport.authenticate("jwt", { session: false }), isCustomer],
(request, response) => {
return models.sequelize.transaction().then(t => {
// I was trying to do this by using a for loop but it doesn't seem to work.
for (var i = 0; i < request.body.length; i++) {
return models.Venue.findById(request.body[i].venue_id)
.then(venue => {
return models.Customer.findById(request.customer.id);
})
.then(customer => {
return models.Table.findAllById(request.body[i].table_id);
})
.then(tables => {
var price = 0;
for (var i = 0; i < tables.length; i++) {
price = price + tables[i].price;
}
return models.Reservation.createReservation(
request.body[i],
price,
request.customer.id
).then(reservation => {
return reservation.addTables(tables).then(() => {
if (request.body.length - 1 === i) {
t.commit().then(() => {
return response.status(200).send(reservation);
});
}
});
});
})
.catch(error => {
console.log(error);
t.rollback().then(() => {
return response.status(error.status_code).send(error.message);
});
});
}
});
}