UNPKG

mongoose-transaction-decorator

Version:
65 lines (64 loc) 2.98 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Transactional = exports.TRANSACTION_SESSION = void 0; const als_1 = require("./als"); const transaction_connection_1 = require("./transaction-connection"); const error_1 = require("./error"); const mongodb_1 = require("mongodb"); exports.TRANSACTION_SESSION = Symbol('TRANSACTION_SESSION'); function Transactional(...args) { let connectionName = transaction_connection_1.DEFAULT_NAME; let options; if (args.length === 1) { if (typeof args[0] === 'string') { connectionName = args[0]; } else { options = args[0]; } } else if (args.length === 2) { [connectionName, options] = args; } return (target, propertyKey, descriptor) => { const originalMethod = descriptor.value; const als = new als_1.ALS(); descriptor.value = function (...args) { return als.run(() => __awaiter(this, void 0, void 0, function* () { const connection = new transaction_connection_1.TransactionConnection().getConnection(connectionName); if (!connection) { throw new error_1.ConnectionNotExistError(); } const session = yield connection.startSession(options); als.set(exports.TRANSACTION_SESSION, session); session.startTransaction(); try { const result = yield originalMethod.apply(this, args); yield session.commitTransaction(); return result; } catch (e) { // 若使用了错误数据库连接创建事务提交,则直接抛出异常结果,否则session.abortTransaction()将产生新的异常覆盖原有异常 if (!(e instanceof mongodb_1.MongoServerError)) { yield session.abortTransaction(); } throw e; } finally { session.endSession(); } })); }; return descriptor; }; } exports.Transactional = Transactional;