MongoRuntimeError


const { MongoClient } = require('mongodb');
const url = 'mongodb://ponyzeng:zty10086@175.24.180.103:27017';
const jwt = require('jsonwebtoken')
const jwt_secret = 'ponyzeng'
const ObjectId = require('mongodb').ObjectId

// 创建连接池
const pool = new MongoClient(url, {
  maxPoolSize: 100,
  waitQueueTimeoutMS: 10000, // 等待队列最大时长 1000ms
  useNewUrlParser: true, 
  useUnifiedTopology: true    // 新版本需要增加该配置项
});
class IdeasController{
 async likeIdeaById(ctx,next){
          const {userId, ideaId, token} = ctx.request.body;
          if (!userId || !ideaId || !token) {
              return ctx.body = {
                  status: 403,
                  text: '网络错误,请稍候重试'
              }
          }
          try{
              // 先进行判断 ,判断用户是否点过赞,
              const client = await pool.connect(); // 从连接池获取一个连接
              const db = client.db('changfar');
              const ideas = db.collection('ideas');
              const likes = db.collection('likes');
              // 判断用户是否点过赞
              const options = [
                  {
                      $match:{
                          _id:ObjectId(ideaId)
                      }
                  },
                  {
                    $lookup: {
                      from: "users",
                      localField: "authorId",
                      foreignField: "_id",
                      as: "userData"
                    }
                  },
                  { $unwind: "$userData" },
                  {
                    $project: {
                      isLike: {
                        $in: [ObjectId(userId), "$likes.userId"]
                      }
                    }
                  }
                ]
                const result_ = await ideas.aggregate(options).toArray();
                if(result_[0].isLike==true){
                  return ctx.body = {
                      status: 206,
                      text:"您已经点过赞了"
                  }
                }
              let result;
              let insert_result;
              // 正式开始事务
              const session = client.startSession();
              session.startTransaction()
              // 正式开始事务
              try{
                  jwt.verify(token,jwt_secret); // 验证token
                  const filter = {_id:ObjectId(ideaId)};
                  const time = formatTime(new Date());
                  const timeStamp = Date.now();
                  const updateDoc = {
                      $addToSet: {
                        likes: {
                          userId:ObjectId(userId),
                          time,
                          timeStamp
                          }
                      },
                      $inc:{
                          likesNumber:1
                      }
                  }
                  const insertDoc = {
                      userId:ObjectId(userId),
                      ideaId:ObjectId(ideaId),
                      time,
                      timeStamp
                  }
                  result = await ideas.updateOne(filter, updateDoc, { session });
                  insert_result = await likes.insertOne(insertDoc, { session });
                  //如果没有错误,则提交事务
                  await session.commitTransaction();
              }catch(e){
                  if(e.name=='JsonWebTokenError'){
                      return ctx.body = {
                          status:404,
                          text:"您当前登录环境异常,请刷新重试"
                      }
                  }
                  // 如果遇到错误,则回滚事务
                  await session.abortTransaction();
                  throw e; // 将错误抛出,让外层的catch捕获错误
              }finally{
                  await session.endSession(); // 结束session
                  await client.close();      // 断开connection
              }
              return ctx.body = {
                  status: 202
              };
          }catch(e){
              console.error(e);
              return ctx.body={
                  status:500,
                  text:'Internal Server Error'
              };
          }    
      }
  // 收藏帖子
      async heartIdeaById(ctx,next){
        console.log(1,'sssssssss')
          const {userId, ideaId, token} = ctx.request.body;
          if (!userId || !ideaId || !token) {
              return ctx.body = {
                  status: 403,
                  text: 'Invalid request parameter'
              }
          }
          try{
              // 先进行判断 ,判断用户是否点过赞,
              const client = await pool.connect(); // 从连接池获取一个连接
              const db = client.db('changfar');
              const ideas = db.collection('ideas');
              const hearts= db.collection('hearts');
              const session = client.startSession();
              // 判断用户是否点过赞
              const options = [
                  {
                      $match:{
                          _id:ObjectId(ideaId)
                      }
                  },
                  {
                    $lookup: {
                      from: "users",
                      localField: "authorId",
                      foreignField: "_id",
                      as: "userData"
                    }
                  },
                  { $unwind: "$userData" },
                  {
                    $project: {
                      isHeart: {
                        $in: [userId, "$hearts.userId"]
                      }
                    }
                  }
                ]
                const result_ = await ideas.aggregate(options).toArray();
                if(result_[0].isHeart==true){
                  return ctx.body = {
                      status: 206,
                      text:"您已经收藏过了"
                  }
                }
              let result;
              let insert_result;
              // 正式开始事务
              let transactionExist = false; // 定义当前会话是否存在事务的标志变量
              // 正式开始事务
              await session.startTransaction()
              transactionExist = true; // 标记当前会话存在事务
              try{
                  jwt.verify(token,jwt_secret); // 验证token
                  const filter = {_id:ObjectId(ideaId)};
                  const time = formatTime(new Date());
                  const timeStamp = Date.now();
                  const updateDoc = {
                      $addToSet: {
                        hearts: {
                          userId:ObjectId(userId),
                          time,
                          timeStamp
                          }
                      },
                      $inc:{
                          heartsNumber:1
                      }
                  }
                  const insertDoc = {
                      userId:ObjectId(userId),
                      ideaId:ObjectId(ideaId),
                      time,
                      timeStamp
                  }
                  result = await ideas.updateOne(filter, updateDoc, { session });
                  insert_result = await hearts.insertOne(insertDoc, { session });
                  //如果没有错误,则提交事务
                  await session.commitTransaction();
                  transactionExist = false; // 标记会话中的事务已成功提交
              }catch(e){
                  if(e.name=='JsonWebTokenError'){
                      return ctx.body = {
                          status:404,
                          text:"您当前登录环境异常,请刷新重试"
                      }
                  }
                  // 如果遇到错误,则回滚事务
                  await session.abortTransaction();
                  throw e; // 将错误抛出,让外层的catch捕获错误
              }finally{
                  if (transactionExist) { // 如果会话存在事务,说明该事务未被提交或回滚,需要手动回滚
                      await session.abortTransaction();
                  }
                  await session.endSession(); // 结束session
                  await client.close();      // 断开connection
              }
              return ctx.body = {
                  status: 202
              };
          }catch(e){
              console.error(e);
              return ctx.body={
                  status:500,
                  text:'Internal Server Error'
              };
          }    
      }
}

当我在客户端同时进行点赞和收藏请求时,服务端会报错MongoRuntimeError: Attempted illegal state transition from [TRANSACTION_COMMITTED] to [TRANSACTION_ABORTED] 请问是代码有什么问题么