如何在带有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 在数组列中查找不起作用