【问题标题】:Unable to retrieve specific user data (Nestjs, TypeORM)无法检索特定用户数据(Nestjs、TypeORM)
【发布时间】:2021-09-25 19:24:36
【问题描述】:

无法检索特定用户数据。保存时,我得到一个用户对象和一个 ID 数组。保存到数据库没有问题,但在接收时它不会返回所有列(列 userId 和assetId 不会出现在输出中)。更具体地说,为了描述问题的结果,它为所有用户而不是特定用户提供所有数据。告诉我如何正确实现请求,让用户接收到他的数据(所有列)而不是所有用户的数据。

-----controller.ts ------

@Controller()
export class UserAssetsController {
  constructor(private readonly assetsUsersService: UserAssetsService) {}

  @UseGuards(JwtAuthGuard)
  @Post()
  async saveUserAssetsData(@Body() dto: UserAssetCreateDto, @Request() request: any) {
    const user = request.user
    return this.assetsUsersService.saveUserAssets(user, dto)
  }

  @UseGuards(JwtAuthGuard)
  @Get()
  async getUserAssetsData(@Request() request: any) {
    return this.assetsUsersService.getUserAssets(request.user)
  }
}

-------- service.ts ----------

@Injectable()
export class UserAssetsService {
  constructor(
    @InjectRepository(UserAsset) private readonly repository: BaseRepository<UserAsset>,
    @InjectRepository(Asset) private readonly assetRepository: BaseRepository<Asset>,
    private readonly cache: CacheService
  ) {}
  async saveUserAssets(user, { assetIds, orderOnPage }: UserAssetCreateDto) {
    const userAssets: Array<UserAsset> = []
    for (let i = 0; i < assetIds.length; i++) {
      const assets = await this.assetRepository.find({ where: [{ id: assetIds[i] }] })
      for (const assetIndex in assets) {
        const userAsset = this.repository.create({
          user,
          orderOnPage,
        })
        userAsset.asset = assets[assetIndex]
        await this.repository.save(userAsset)
        userAssets.push(userAsset)
      }
    }
    console.log(userAssets)
    return userAssets
  }

  async getUserAssets(user) {
    return this.repository.find()
  }
}

--------- model.ts -----------------------------

@Entity('user_assets')
export class UserAsset extends TimestampMixin {
  @ManyToOne(type => User, user => user.assets, { onDelete: 'CASCADE' })
  user: User

  @ManyToOne(type => Asset, { onDelete: 'CASCADE' })
  asset: Asset

  @Column({ nullable: true, length: 250 })
  offlineAssetCustomName: string

  @Column({ nullable: true })
  offlineAssetAnnualRate: number

  @Column()
  orderOnPage: number

  @OneToMany(type => UserAssetComment, comment => comment.asset)
  comments: UserAssetComment[]

  @OneToMany(type => UserAssetAlert, userAssetAlert => userAssetAlert.asset)
  alerts: UserAssetAlert[]
}

【问题讨论】:

    标签: typescript postgresql nestjs typeorm


    【解决方案1】:

    Typeorm 仅返回由 Column decorator 定义的属性。如果您希望返回参考列,唯一要做的就是将它们作为列添加到您的实体中,例如:

    @Entity('user_assets')
    export class UserAsset extends TimestampMixin {
      @ManyToOne(type => User, user => user.assets, { onDelete: 'CASCADE' })
      user: User
      
      // User reference column
      @Column()
      userId: number
    
      @ManyToOne(type => Asset, { onDelete: 'CASCADE' })
      asset: Asset
    
      // Asset reference column
      @Column()
      assetId: number
    
      //rest of your entity
    }
    

    然后您也可以将它们用作find option。所以你的函数应该是这样的:

    async getUserAssets(user) {
        return this.repository.find({userId: user.id})
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 2017-05-20
      • 2021-10-19
      • 1970-01-01
      • 2021-01-22
      • 2019-08-13
      • 2019-11-13
      相关资源
      最近更新 更多