如何在带有 typeorm 的 nestjs 项目中使用外部实体?

bet*_*tti 3 typeorm nestjs

我正在尝试使用在项目外部定义的类型 orm 实体。也就是说,我有两个项目:models 和 core-api。模型是一个导出实体定义的 npm 包。因此,从 core-api(nestjs project) 我试图使用这些实体定义连接。像这样的东西:

@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 {}
Run Code Online (Sandbox Code Playgroud)

然后,在 A 模块中,我从 npm 包中导入 A 实体:

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 {}
Run Code Online (Sandbox Code Playgroud)

这最终会出现下一个错误:

RepositoryNotFoundError: No repository for "A" was found. Looks like this entity is not registered in current "/sf/answers/3793405941/://stackoverflow.com/a/54191513/3943197default" connection?

我完全不知道如何遵循,因为我不明白它在幕后是如何工作的。我看到了 typeorm 和 @nestjs/typeorm 的代码,但我不知道如何解决它。

谢谢!

更新: 我可以添加实体类而不是像@serianox 所说的路径。此外,something/modelsnpm 包导出一个独立的嵌套模块。此模块导入/导出包上定义的实体。因此,我可以在主应用程序上注入实体。

小智 5

您可以将类的引用传递给“实体”而不是路径,例如:

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 {}
Run Code Online (Sandbox Code Playgroud)


zen*_*eni 0

看来您正在.ts从 node_modules 导入文件。我相信一旦你构建了 npm 包,这些实体现在就是.js文件了。您应该尝试修改表达式,以便它可以解析 .js 文件。

就我个人而言,我从不使用它ts-node,因为它会带来这种麻烦,而且调试也无法真正使用它。我觉得你应该始终使用node运行时并仅解析.js文件(而且,它更接近生产运行时)。