Mongodb 需要创建mongoose事务包装器,它将会话作为参数传递给实际执行查询操作以创建或更新的函数

Mongodb 需要创建mongoose事务包装器,它将会话作为参数传递给实际执行查询操作以创建或更新的函数,mongodb,mongoose,transactions,es6-promise,Mongodb,Mongoose,Transactions,Es6 Promise,假设我有一个函数,负责用户创建,这是我们以前可以使用的。现在,我们只希望函数以一个事务的形式工作,如果成功或遇到任何错误时完全失败,该事务将一起创建所有用户。我假设只将会话从事务包装器传递到现有函数应该解决这个问题。任何数量的此类函数都可以一起传递,包装器应该将它们作为单个事务处理 const createUsers = async (users = []) => { try { return UserModel.create(users).then((res) =>

假设我有一个函数,负责用户创建,这是我们以前可以使用的。现在,我们只希望函数以一个事务的形式工作,如果成功或遇到任何错误时完全失败,该事务将一起创建所有用户。我假设只将会话从事务包装器传递到现有函数应该解决这个问题。任何数量的此类函数都可以一起传递,包装器应该将它们作为单个事务处理

 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);
  }
};
使用



我希望会话部分在包装器中单独处理。这样,我们就可以传递与上面一样多的函数,并且基于每个查询的成功,整个事务就变成了true@RajibKumarDey
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();
  }
};