Как мне проверить, что мои транзакции w. Пн goose правильно ли обрабатывают ошибки / откаты? - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь узнать, как реализовать транзакции для простого приложения в 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);
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...