NodeJS Mongoose | Почему тайм-аут транзакции?

#node.js #mongodb #mongoose #transactions

Вопрос:

Я хочу использовать транзакции и следовал руководству mongoose, но мой код не работает. Вот минимальный нерабочий пример:

 const mongoose = require('mongoose');

const Customer = mongoose.model('Customer', new mongoose.Schema({ firstName: { type: String } }));

const start = async () => {
  try {
    const db = await mongoose.createConnection("mongodb://localhost:27017/transactions");
    const session = await db.startSession();

    await session.withTransaction(() => {
      return Customer.create([{ firstName: "peter" }], { session: session });
    });
  }
  catch (error) {
    console.error(error);
  }
};

start();
 

Я получаю следующую ошибку:

 MongooseError: Operation `customers.insertOne()` buffering timed out after 10000ms
    at Timeout.<anonymous> (C:UsersjoshuaDocumentsBusinesstransactionMongoDBStudytransactionMongoDbnode_modulesmongooselibdriversnode-mongodb-nativecollection.js:149:23)
    at listOnTimeout (internal/timers.js:557:17)
    at processTimers (internal/timers.js:500:7)

 

Я делаю это так же, как описано здесь: https://mongoosejs.com/docs/transactions.html но это не работает, и я не знаю почему.

Ответ №1:

Я столкнулся с той же ошибкой. И я решил эту проблему, используя mongoose.connect function вместо mongoose.createConnection function .Вы можете изменить свой код подключения к БД с помощью чего-то подобного.

 const db = await mongoose.connect("mongodb://localhost:27017/transactions");
 

Комментарии:

1. Эй, спасибо за ваш ответ, но это не делает работу для меня. Я получу другую ошибку: (node:21664) UnhandledPromiseRejectionWarning: MongoServerError: Transaction numbers are only allowed on a replica set member or mongos

Ответ №2:

РЕШЕНИЕ Вы должны использовать MongoDB с репликой. Я просто использовал выделенный сервер, размещенный в Atlas, и он работает.

Ответ №3:

withTransaction должен вернуть обещание. В основном просто добавьте async перед объявлением функции

 await session.withTransaction(() => {
   return Customer.create([{ firstName: "peter" }], { session: session });
});