mongoose-transaction-decorator
Version:
mongoose transaction decorator
65 lines (64 loc) • 2.98 kB
JavaScript
;
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;