2
votes

Comment utiliser des entités externes dans un projet nestjs avec typeorm?

J'essaye d'utiliser des entités de type orm définies en dehors du projet. Autrement dit, j'ai deux projets: modèles et core-api. Models est un package npm qui exporte la définition des entités. Donc, à partir de core-api (projet nestjs), j'essaye de définir la connexion en utilisant ces entités. Quelque chose comme ceci:

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AsController } from './As.controller';
import { AsService } from './As.service';
import { A } from 'something/models';

@Module({
  imports: [TypeOrmModule.forFeature([ A ])],
  controllers: [AController],
  providers: [AService],
})
export class AModule {}

Ensuite, dans le module A, j'importe l'entité A du package npm:

@Module({
    imports: [ TypeOrmModule.forRoot({
    type: 'postgres',
    host: 'postgres',
    port: 5432,
    username: 'myuser',
    password: 'mypass',
    database: 'mydb',
    entities: [
        __dirname + '../node_modules/something/models/src/*.entity.ts'
    ],
    synchronize: true,
    }), AModule ],
    controllers: [],
    providers: [],
})
export class AppModule {}

Ceci se termine avec l'erreur suivante:

RepositoryNotFoundError: Aucun dépôt pour "A" n'a été trouvé. Il semble que cette entité ne soit pas enregistrée dans la connexion actuelle "https://stackoverflow.com/a/54191513/3943197https://stackoverflow.com/a/54191513/3943197default"?

I Je suis assez perdu dans la façon de suivre car je ne comprends pas comment cela fonctionne sous le capot. J'ai vu le code de typeorm et @ nestjs / typeorm mais je ne savais pas comment le résoudre.

Merci!

MISE À JOUR: Je pourrais le faire fonctionner en ajoutant la classe d'entité au lieu d'un chemin comme @serianox dit. De plus, le package something / models npm exporte un module d'imbrication autonome. Ce module importe / exporte les entités définies sur le package. Ainsi, je pourrais injecter les entités sur l'application principale.


0 commentaires

3 Réponses :


0
votes

Il semble que vous importiez des fichiers .ts depuis node_modules. Je crois qu'une fois que vous avez construit votre package npm, ces entités sont désormais des fichiers .js . Vous devriez essayer de modifier votre expression afin qu'elle puisse analyser les fichiers .js.

Personnellement, je n'utilise jamais ts-node car il apporte ce genre de problèmes et le débogage n'est pas vraiment disponible avec lui. Je pense que vous devriez toujours utiliser le runtime node et analyser uniquement les fichiers .js (également, il est plus proche du runtime de production).


0 commentaires

4
votes

Vous pouvez passer les références aux classes aux "entités" au lieu du chemin, par exemple:

import {Entity1, Entity2} from '@models'

@Module({
    imports: [ TypeOrmModule.forRoot({
    type: 'postgres',
    host: 'postgres',
    port: 5432,
    username: 'myuser',
    password: 'mypass',
    database: 'mydb',
    entities: [
        Entity1, Entity2
    ],
    synchronize: true,
    }), AModule ],
    controllers: [],
    providers: [],
})
export class AppModule {}


2 commentaires

Oui, c'est une des choses dont j'avais besoin. Merci!


comment accéder aux @models?



0
votes

Je pense avoir trouvé une solution de contournement à ce problème;

nous pouvons importer des modules à partir du module npm comme celui-ci

const dbConfig = TypeOrmModule.forRoot({
  type: "postgres",
  database: config.postgres.db,
  host: config.postgres.host,
  port: Number(config.postgres.port),
  username: config.postgres.user,
  password: config.postgres.pass,
  entities: models,
  synchronize: true,
});

puis les itérer et les stocker dans un tableau p >

const models = [];
for (const key in Models) {
  if (Models.hasOwnProperty(key)) {
    const model = Models[key];
    models.push(model);
  }
}

enfin utiliser dans la définition du module

import * as Models from "your-models-package";

J'espère que cela aide

bravo

p>


0 commentaires