Я пытаюсь узнать, как реализовать транзакции для простого приложения в Mon goose с express для RESTful API.
Мне удалось собрать небольшую функцию с одним изменением, используя вспомогательная функция mongoDB session.withTransaction (). Этот блок кода работает без ошибок, и документ появляется в БД, как и следовало ожидать.
function createCourse() {
try {
return Course.createCollection()
.then(() => mongoose.startSession())
.then(session => {
session.withTransaction(() => {
return Course.create(
[
{
author: "Larry",
category: "web",
tags: ["tag1", "tag2"],
isPublished: false,
price: 15,
name: "Tester series 3"
}
],
{ session }
);
});
});
} catch (error) {
console.error(error);
}
}
Мне кажется, что я что-то упустил из-за того, как структурировать свои операции с этой функцией. Объединение всего в метод Express POST, похоже, что это работает, но я был бы признателен за проверку кода.
Кроме того, как я могу go проверить, правильно ли код обрабатывает ошибки / рулон-спина? Поместите session.abortTransaction (); где-нибудь в блоке sesson.withTransaction ()?
router.post("/", async (req, res) => {
try {
validateRental(req.body);
} catch (error) {
return res.status(400).send(error.details[0].message);
}
let customer = null;
try {
customer = await Customers.findById(req.body.customerId);
} catch (err) {
return res.status(400).send("Invalid customer.");
}
let movie = null;
try {
movie = await Movies.findById(req.body.movieId);
} catch (err) {
return res.status(400).send("Invalid movie.");
}
if (movie.numberInStock === 0)
return res.status(400).send("Movie not in stock.");
try {
mongoose.startSession().then(session => {
session.withTransaction(async () => {
let rental = new Rentals({
renter: {
_id: customer._id,
name: customer.name,
phone: customer.phone,
isGold: customer.isGold
},
movie: {
_id: movie._id,
title: movie.title,
dailyRentalRate: movie.dailyRentalRate
}
});
await rental.save({ session });
movie.numberInStock--;
await movie.save({ session });
res.send(rental);
});
});
} catch (err) {
res.status(500).send(err.message);
}
});