需要创建一个 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();
  }
};