mongoose Mongo中的Nestjs事务不工作

bvpmtnay  于 12个月前  发布在  Go
关注(0)|答案(1)|浏览(116)

我想做一个交易,我正在使用findOneAndUpdate,我得到以下错误:“MongoServerError:Transaction numbers are only allowed on a replica set member or mongos”。我该怎么办?
app.module.ts:

imports...

@Module({
  imports: [
    ...,
    MongooseModule.forRoot(process.env.URL_DATABASE, {
      useNewUrlParser: true,
      useUnifiedTopology: true,
      retryAttempts: 2,
    }),
  ],
  controllers: [AppController],
  providers: [
    AppService,
  ],
})
export class AppModule {}

字符串
my.service.ts:

import { Connection } from "mongoose"

export class MyService {
 constructor(
    @InjectModel(User.name)
    private userModel: Model<UserDocument>,
    @InjectConnection() private readonly connection: Connection,
  ) {}
}

async delete(idPa: string): Promise<boolean> {
 let result = false;
 const session = await this.connection.startSession();

 try {
      await session.withTransaction(async () => {
        await this.userModel.findOneAndUpdate(
          { _id: idPa },
          { status: false },
          { session },
        );
      });

      result = true;
    } finally {
      await session.endSession();
    }
}


因此,当从控制器运行我的服务时,我得到:MongoServerError:Transaction numbers are only allowed on a replica set member or mongos.

2g32fytz

2g32fytz1#

我终于找到了解决方案,事实证明,我必须对我的数据库进行额外的配置,即“副本集”。

请按照以下步骤操作:

1.安装mongosh
1.创建3个目录。
1.执行以下命令:

mongosh –-dbpath "C:\data1\db" –-port 27017 --replSet rs0 --bind_ip 127.0.0.1
mongosh –-dbpath "C:\data2\db" –-port 27018 --replSet rs0 --bind_ip 127.0.0.1
mongosh –-dbpath "C:\data3\db" –-port 27019 --replSet rs0 --bind_ip 127.0.0.1

注意:对于这些命令中的每一个,打开一个新的cmd

1.打开一个新的cmd并打开父目录:cmd mongosh --port 27017
一旦进入。按照这些步骤。

  1. rs.initiate()
  2. rs.reconfig({ _id: "rs0", members: [{ _id: 0, host: "127.0.0.1:27017" }, { _id: 1, host: "127.0.0.1:27018" }, { _id: 2, host: "127.0.0.1:27019" }] }, {force:true});

然后转到子节点27018和27019,并添加以下命令。

节点27018执行步骤:

  1. mongosh --port 27018
  2. db.getMongo().setReadPref('secondary')
    节点27019转到步骤:
  3. mongosh --port 27019
  4. db.getMongo().setReadPref('secondary')
    最后,再次执行事务,我的app.module.ts仍然保持不变,记住本地连接将始终为127.0.0.1

相关问题