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

Posted

技术标签:

【中文标题】如何在带有typeorm的nestjs项目中使用外部实体?【英文标题】:How use external entities in nestjs project with typeorm? 【发布时间】:2019-06-04 05:48:10 【问题描述】:

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

@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 

然后,在 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 

这会导致下一个错误:

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

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

谢谢!

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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 

【讨论】:

是的,这是我需要的东西之一。谢谢! 你如何访问@models?【参考方案3】:

我认为找到了解决此问题的方法;

我们可以像这样从 npm 模块导入模块

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

然后迭代它们并存储在一个数组中

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

最终在模块定义中使用

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,
);

希望对你有帮助

干杯

【讨论】:

以上是关于如何在带有typeorm的nestjs项目中使用外部实体?的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 TypeOrm 的 NestJS 连接 MySQL 数据库时出现问题

NestJS TypeORM mongodb 在数组列中查找不起作用

如何使用返回多个项目的 TypeORM 设置 Nestjs 查询?

过滤从查询参数传递的数组。 NestJS,TypeORM

如何在 NestJs 中捕获 Typeorm 事务错误

NestJS + TypeORM:使用两个或更多数据库?