Nestjs: Как использовать мангуста для запуска сеанса для транзакции?

#mongoose #nestjs

Вопрос:

Документация мангуста по использованию транзакции проста, но когда она выполняется в nestjs, она возвращает ошибку:

 Connection 0 was disconnected when calling `startSession`
MongooseError: Connection 0 was disconnected when calling `startSession`
    at NativeConnection.startSession
 

Мой код:

 const transactionSession = await mongoose.startSession();
    transactionSession.startTransaction();

    try
    {
      const newSignupBody: CreateUserDto = {password: hashedPassword, email, username};
  
      const user: User = await this.userService.create(newSignupBody);

      //save the profile.
      const profile: Profile = await this.profileService.create(user['Id'], signupDto);

      const result:AuthResponseDto = this.getAuthUserResponse(user, profile);

      transactionSession.commitTransaction();
      return resu<
    }
    catch(err)
    {
      transactionSession.abortTransaction();
    }
    finally
    {
      transactionSession.endSession();
    }
 

Ответ №1:

Я нашел решение после изучения @nestjs/мангуста. Мангуст здесь не имеет к этому никакого отношения. Это является причиной возврата ошибки.

Решение:

 import {InjectConnection} from '@nestjs/mongoose';
import * as mongoose from 'mongoose';
 

В конструкторе класса службы нам нужно добавить параметр подключения, который может использоваться службой.

 export class AuthService {
constructor(
  // other dependencies...
  @InjectConnection() private readonly connection: mongoose.Connection){}
 

Вместо

 const transactionSession = await mongoose.startSession();
transactionSession.startTransaction();
 

Теперь мы будем использовать:

 const transactionSession = await this.connection.startSession();
transactionSession.startTransaction();
 

Таким образом, проблема отключения после StartSession() может быть решена.