RepositorioNotFoundError: No se encontró ningún repositorio para "User". Parece que esta entidad no está registrada en la conexión "default" actual? Tiporm

Estoy teniendo un problema divertido tratando de conseguir que TipoOrm trabaje en mi proyecto Nestjs.

Tengo el siguiente código para configurar mi proyecto, sí todo carga, y sí puedo conectarme a mi base de datos.

import { CacheModule, Module } from '@nestjs/common';
import { JwtModule } from '@nestjs/jwt';
import { PassportModule } from '@nestjs/passport';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './entities/user.entity';
import { ConfigModule } from '@nestjs/config';
import { AuthenticationController } from './controllers/authentication.controller';
import { AuthenticationService } from './services/authentication.service';
import { Connection } from 'typeorm';
import { BaseEntity } from './entities/base.entity';

@Module({
  imports: [
    ConfigModule.forRoot(),
    TypeOrmModule.forRoot({
        type: 'postgres',
        host: 'localhost',
        port: 5432,
        username: 'postgres',
        password: process.env.POSTGRE_PASSWORD,
        database: process.env.DATABASE,
        migrationsTableName: 'migration_table',
        entities: [User, BaseEntity],
        migrations: [__dirname + '/migrations/**/*.ts'],
        subscribers: [__dirname + '/subscribers/**/*.ts'],
        cli: {
          entitiesDir: '/entitys',
          migrationsDir: '/migrations',
          subscribersDir: '/subscribers',
        },
        synchronize: true,
        autoLoadEntities: true,
    }),
    CacheModule.register(),
    PassportModule,
    JwtModule.register({
      secret: 'myprivatekey',
      signOptions: { expiresIn: '1d' },
    }),
  ],
  controllers: [AuthenticationController],
  providers: [AuthenticationService],
})
export class AppModule {
  constructor(private connection: Connection) {}
}

y aquí están las entidades:

import {
  Column,
  BeforeUpdate,
  BeforeInsert,
} from 'typeorm';

export class BaseEntity {
  @Column()
  created_at: Date;

  @Column({
    default: new Date(),
  })
  updated_at: Date;

  @BeforeUpdate()
  updateUpdatedAt() {
    this.updated_at = new Date();
  }

  @BeforeInsert()
  updateCreatedAt() {
    this.created_at = new Date();
  }
}
import {
  Entity,
  Column,
  PrimaryGeneratedColumn,
  Generated,
} from 'typeorm';

import { BaseEntity } from './base.entity';

@Entity('users')
export class User extends BaseEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  @Generated('uuid')
  uuid: string;

  @Column()
  first_name: string;

  @Column()
  last_name: string;

  @Column()
  email: string;

  @Column()
  password: string;

  @Column({
    default: false,
  })
  confirmed: boolean;

  @Column({
    default: null,
  })
  seller_id: string;

  @Column({
    default: null,
  })
  auth_token: string;

  @Column({
    default: false,
  })
  is_admin: boolean;
}

Originalmente intenté hacer un partido de patrón de glob, sin ningún beneficio, así que ahora estoy importando directamente en mis Entidades hasta que pueda conseguir algo para correr. También tenga en cuenta que todos mis módulos cargan antes del error anterior y que el error es de usar el decorador @InjectRepository() dentro del controlador de autenticación o controlador de administrador. En todas partes que he mirado ha dicho esto porque mis entidades no están siendo cargadas, lo cual no estoy seguro de cómo es posible. Gracias.

Pregunta hecha hace 3 años, 2 meses, 7 días - Por scriptsorcerer4f7e


11 Respuestas:

  • En mi caso tuve un error en modo de producción, para corregirlo añadí el camino de los archivos JS compilados en el build carpeta.

    const conn: MongoConnectionOptions = {
      type: 'mongodb',
      url: DB_URL,
      synchronize: true,
      useNewUrlParser: true,
      useUnifiedTopology: true,
      logging: true,
      entities: ['src/entity/*.ts', './build/src/entity/*.js'], // <- Here!
      migrations: ['src/migration/**/*.ts'],
      subscribers: ['src/subscriber/**/*.ts'],
      cli: {
        entitiesDir: 'src/entity',
        migrationsDir: 'src/migration',
        subscribersDir: 'src/subscriber',
      },
      extra: {
        authSource: DB_AUTH_SOURCE,
      },
    };
    

    La versión corta podría ser: entities: ['**/src/entity/*{.ts,.js}'],

    Respondida el Dec 17, 2020 a las 08:19 - por byteexplorer

    Votos positivos: 0 | Votos negativos: 0

  • Intenta dar un nombre a tu entidad con el decorador @Entity:

    import { Entity, PrimaryColumn, Column } from "typeorm";
    @Entity("category") // <-- Right here
    

    Respondida el Dec 17, 2020 a las 08:24 - por pixelpilot

    Votos positivos: 0 | Votos negativos: 0

  • Parece que lo es, como dijiste, porque las entidades no están cargadas.

    Mi suposición es: el archivo de configuración que ha añadido intenta encontrar los archivos en:

      migrations: [__dirname + '/migrations/**/*.ts'],
      subscribers: [__dirname + '/subscribers/**/*.ts'],
    

    ¿Son esos archivos de entidad en el mismo dir que el módulo? podría ayudar a imprimir la salida de esos caminos sólo para asegurarse de que es correcto.

    también note que el tiposcript compila a javascript, por lo que puede encontrarse con el mismo problema si ejecuta el código de /dist, porque será capaz de ver solamente los archivos compilados ".js", así que sugiero utilizar

      migrations: [__dirname + '/migrations/**/*{.ts,.js}'],
      subscribers: [__dirname + '/subscribers/**/*{.ts,.js}'],
    

    si no es nada de las 2 opciones anteriores, por favor proporcione las rutas completas de las entidades y módulos en juego.

    Respondida el Dec 17, 2020 a las 08:34 - por scriptsorcererf493

    Votos positivos: 0 | Votos negativos: 0

  • Enfrenté el mismo problema, los caminos de glob no funcionan en caso de monorepo.

    Note, however, that senderos de glob no son soportados por webpack, así que si usted está construyendo su aplicación dentro de un monorepoNo podrás usarlos. Para abordar esta cuestión, se ofrece una solución alternativa. Para cargar automáticamente entidades, establece la propiedad AutoLoadEntities del objeto de configuración (pasado en el método forRoot().

    Tenga en cuenta que las entidades que no están registradas a través del método forFeature(), pero sólo se refieren a la entidad (a través de una relación), no se incluirán a través de la configuración de AutoLoadEntities.

    -- NestJS Docs

    Además, estaba usando ormconfig.ts, que también presenta una dificultad más -

    Tenga en cuenta que el archivo ormconfig.json está cargado por la biblioteca tipoorm. Así, cualquiera de las propiedades extra descritas anteriormente (que son soportadas internamente por medio del método forRoot() - por ejemplo, AutoLoadEntities y retryDelay) no se aplicará. Por suerte, TypeORM proporciona la función getConnectionOptions que lee opciones de conexión desde el archivo ormconfig o variables ambientales. Con esto, todavía puede utilizar el archivo de configuración y configurar opciones específicas de Nest.

    -- NestJS Docs

    Solución final

    1. módulo de root/main -
    import { getConnectionOptions } from 'typeorm';
    ...
    @Module({
      imports: [
       TypeOrmModule.forRootAsync({
        useFactory: async () =>
          Object.assign(await 
           getConnectionOptions(), {
            autoLoadEntities: true,
          }),
        })
       ],
     ...
    })
    
    1. app/child module -
    ...
    @Module({
      imports: [TypeOrmModule.forFeature([])],
      ...
    })
    ...
    

    Respondida el Dec 17, 2020 a las 08:39 - por techinnovator

    Votos positivos: 0 | Votos negativos: 0

  • En mi caso, lo resolví declarando la entidad en el archivo de conexión.

    La documentación TipoORM explica este cambio.

    Crear una conexión con la base de datos

    Ahora, cuando se crea nuestra entidad, vamos a crear un fichero index.ts (o app.ts como lo llames) y establecer nuestra conexión allí:

    import "reflect-metadata";
    import { createConnection } from "typeorm";
    import { Photo } from "./entity/Photo";
    
    createConnection({
        type: "mysql",
        host: "localhost",
        port: 3306,
        username: "root",
        password: "admin",
        database: "test",
        entities: [
            Photo
        ],
        synchronize: true,
        logging: false
    }).then(connection => {
        // here you can start to work with your entities
    }).catch(error => console.log(error));
    

    Respondida el Dec 17, 2020 a las 08:49 - por pixelpioneerbbb5

    Votos positivos: 0 | Votos negativos: 0

  • Asegúrese de poner el signo @ delante de su decorador de entidad (3 de mis entidades no lo hizo y el mensaje de error estaba relacionado con las relaciones porque no encontró mis entites)

    Respondida el Dec 17, 2020 a las 08:59 - por techtactician

    Votos positivos: 0 | Votos negativos: 0

  • Tenía el mismo problema y añadí las siguientes propiedades en mi ormconfig:

    "cli":{
        "migrationsDir":"./src/database/migrations",
        "entitiesDir": ".src/modules/cars/entities"
      },
      "entities": [
        "./src/modules/cars/entities/**/*{.ts,.js}" 
    ]

    Funciona bien para mí.

    Respondida el Dec 17, 2020 a las 09:05 - por techinnovator

    Votos positivos: 0 | Votos negativos: 0

  • Tenía todo correcto excepto el nombre de archivo.

    Debería ser como entityname.entity.ts

    Pero era como entityname.ts

    Respondida el Dec 17, 2020 a las 09:15 - por codecrusaderx58e2

    Votos positivos: 0 | Votos negativos: 0

  • Al leer el código fuente me di cuenta de que las cadenas todavía están allí (dentro del paquete JS), por lo que está llamando algo que no está allí ya que todos los archivos están dentro de él, intenté importar los modelos directamente dentro de la aplicación.module y no pasar cadenas o patrones a la matriz de entidades, pero las clases de entidad importada en su lugar, que funcionó como un encanto.

    Dado, este puede no ser el enfoque más limpio, porque usted tiene que escribir los caminos en las importaciones a diferentes módulos e importarlos uno por uno. Sería genial ver lo que otros tienen que decir sobre cómo abordar y mejorar en esto para que podamos lograr una solución más limpia.

    Esto funciona hoy a partir de Nov/2021.

    Respondida el Dec 17, 2020 a las 09:23 - por scriptsculptor

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás experimentando indicaba que el repositorio para la entidad "User" no fue encontrado en la conexión "default" actual. Existen algunas posibles causas para este problema:

    • Verifica si has importado las entidades correctamente en tu archivo `app.module.ts`. En el fragmento de código que proporcionaste, parece que has importado la entidad `User` correctamente:
    typescript
    import { User } from './entities/user.entity';
    

    Sin embargo, también importaste la clase BaseEntity, pero esta no es una entidad de base de TypeORM, sino más bien una clase de la que extienden tus entidades. Por lo tanto, no es necesario incluir BaseEntity en la lista de entidades en la configuración de TypeORM.

    • Revisa si las rutas de los directorios para las entidades, migraciones y suscriptores son correctas en la configuración de TypeORM. En tu configuración, estás utilizando rutas relativas para definir las rutas de los directorios. Asegúrate de que estas rutas sean correctas y apunten a los directorios correctos en tu proyecto.
    1. Asegúrate de que no

    Respondida el Dec 18, 2020 a las 08:16 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás viendo se debe a que TypeORM no pudo encontrar una entidad llamada "User" en la conexión actual. Esto generalmente ocurre cuando la entidad no se ha cargado o registrado correctamente en TypeORM.

    Aquí tienes algunos pasos que puedes seguir para resolver el problema:

    • Asegúrate de que la clase `User` esté decorada con `@Entity()`.
    • Verifica que la clase `User` se haya importado en el módulo donde estás intentando utilizarla.
    • Comprueba que el módulo que contiene la clase `User` se esté importando en el módulo principal de la aplicación.
    • Intenta reiniciar el servidor o la aplicación después de realizar los cambios.

    Si has seguido todos estos pasos y el problema persiste, puedes intentar proporcionar más información sobre tu proyecto, como la versión de TypeORM que estás utilizando y cualquier configuración personalizada que hayas aplicado.

    Respondida el Dec 18, 2020 a las 08:24 - por Gemini

    Votos positivos: 0 | Votos negativos: 0