es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

NestJS TypeORM No se pueden leer las propiedades de indefinido (leyendo ‘id’) del DTO

Tengo este problema, No se pueden leer las propiedades de undefined (leyendo 'id') y cuando elimino este campo userId, funciona perfectamente, así que sé que userId está causando el error. userId es de otra entidad. ¿Qué me falta? ¡Gracias!

Aquí está mi report.entity.ts

@Entity()
export class Report {
  @PrimaryGeneratedColumn()
  id: number;

  //otros campos aquí
  @Column()
  mileage: number;

  @ManyToOne(() => User, (user) => user.reports, { eager: true })
  user: User;
}

Aquí está mi report.dto.ts

export class ReportDto {
  @Expose()
  id: number;

  //otros campos aquí
  @Transform(({ obj }) => obj.user.id,)
  @Expose()
  userId: number;
}

Aquí está mi código de controller:

@Get()
getEstimate(@Query() query: GetEstimateDto) {
  return this.reportService.createEstimate(query);
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Basado en el código proporcionado, parece que el error está ocurriendo al intentar acceder a la propiedad id de user, que es una entidad relacionada en la entidad Reporte. El error sugiere que user no está definido, lo que significa que la relación entre Reporte y Usuario no se está estableciendo correctamente.

    Para solucionar este problema, debe asegurarse de que la entidad Reporte esté adecuadamente vinculada a la entidad Usuario, y que la propiedad user de Reporte esté correctamente poblada con la entidad correspondiente de Usuario. Esto se puede lograr ya sea mediante la carga ansiosa o la carga perezosa al recuperar entidades de Reporte de la base de datos.

    En su caso, ya está utilizando la carga ansiosa al recuperar entidades de Reporte, como se indica en la opción { eager: true } del decorador @ManyToOne. Sin embargo, para asegurarse de que la propiedad user esté correctamente poblada con la entidad correspondiente de Usuario, es posible que necesite modificar su archivo report.service.ts para asegurarse de que la entidad Usuario esté adecuadamente vinculada a la entidad Reporte al crear un nuevo reporte.

    Además, en su clase ReportDto, se utiliza el decorador @Transform para transformar report.user.id en report.userId, pero esta transformación asume que user siempre está definido, lo cual no siempre es el caso. Por lo tanto, debe modificar su clase ReportDto para verificar si user está definido antes de acceder a su propiedad id.

    Aquí hay una versión actualizada de su clase ReportDto que verifica si user está definido:

    export class ReportDto {
      @Expose()
      id: number;
    
      //otros campos aquí
      @Transform(({ obj }) => obj.user ? obj.user.id : null)
      @Expose()
      userId: number;
    }
    

    Finalmente, para investigar y resolver aún más el problema, sería útil ver el código de su archivo report.service.ts y la entidad Usuario.

Comments are closed.