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] 请问是代码有什么问题么