需要创建一个 mongoose 事务包装器,它将会话作为参数传递给实际执行查询操作以创建或更新的函数
need to create a mongoose transaction wrapper which will pass session as parameter to functions that actually do query operations to create or update
所以假设我有一个功能可以处理用户创建,我们以前可以使用它。现在我们只希望函数以一个事务的形式工作,如果成功则创建所有用户,或者在遇到任何错误时完全失败。我假设只将会话从事务包装器传递到现有函数应该处理这个问题。可以将任意数量的此类函数一起传递,包装器应将它们全部作为单个事务处理。
const createUsers = async (users = []) => {
try {
return UserModel.create(users).then((res) => {
logger.info(`[Start-Up] Created ${res.length} users`);
}, (rej) => {
logger.error(`[Start-Up] Failed to create users - ${rej}`);
throw new Error(rej);
});
} catch (err) {
throw new Error('Failed to create Users', err);
}
};
使用https://www.npmjs.com/package/mongoose-transactions
https://mongoosejs.com/docs/transactions.html
const createUsers = async (users = []) => {
const session = await UserModel.startSession();
try {
await session.withTransaction(() => {
return UserModel.create(users, { session: session }).then((res) => {
logger.info(`[Start-Up] Created ${res.length} users`);
}, (rej) => {
logger.error(`[Start-Up] Failed to create users - ${rej}`);
throw new Error(rej);
});
});
} catch (err) {
throw new Error('Failed to create Users', err);
} finally {
session.endSession();
}
};
所以假设我有一个功能可以处理用户创建,我们以前可以使用它。现在我们只希望函数以一个事务的形式工作,如果成功则创建所有用户,或者在遇到任何错误时完全失败。我假设只将会话从事务包装器传递到现有函数应该处理这个问题。可以将任意数量的此类函数一起传递,包装器应将它们全部作为单个事务处理。
const createUsers = async (users = []) => {
try {
return UserModel.create(users).then((res) => {
logger.info(`[Start-Up] Created ${res.length} users`);
}, (rej) => {
logger.error(`[Start-Up] Failed to create users - ${rej}`);
throw new Error(rej);
});
} catch (err) {
throw new Error('Failed to create Users', err);
}
};
使用https://www.npmjs.com/package/mongoose-transactions
https://mongoosejs.com/docs/transactions.html
const createUsers = async (users = []) => {
const session = await UserModel.startSession();
try {
await session.withTransaction(() => {
return UserModel.create(users, { session: session }).then((res) => {
logger.info(`[Start-Up] Created ${res.length} users`);
}, (rej) => {
logger.error(`[Start-Up] Failed to create users - ${rej}`);
throw new Error(rej);
});
});
} catch (err) {
throw new Error('Failed to create Users', err);
} finally {
session.endSession();
}
};