#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 });
});