当前位置: 首页 > 知识库问答 >
问题:

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

谯和煦
2023-03-14

我试图使用项目外部定义的类型orm实体。也就是说,我有两个项目:模型和核心api。Models是导出实体定义的npm包。因此,从核心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 {}

然后,在一个模块中,我从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:未找到"A"的存储库。看起来这个实体没有在当前的"https://stackoverflow.com/a/54191513/3943197https://stackoverflow.com/a/54191513/3943197default"连接中注册?

我完全不知道如何跟随,因为我不明白它在引擎盖下是如何工作的。我看到了typeorm和@nestjs/typeorm的代码,但我不知道如何解决它。

谢谢

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

共有3个答案

章乐逸
2023-03-14

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

我们可以像这样从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,
});

我希望能有所帮助

干杯

公羊伟志
2023-03-14

似乎您正在导入。ts来自节点\u模块的文件。我相信,一旦您构建了npm包,这些实体现在就是。js文件。您应该尝试修改表达式,以便它可以进行解析。js文件。

就我个人而言,我从来没有使用过ts节点,因为它会带来这种麻烦,而且调试也不可用。我觉得您应该始终使用节点运行时并仅解析。js文件(另外,它更接近生产运行时)。

牧献
2023-03-14

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

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 {}
 类似资料:
  • 开始新项目与'巢新'命令。工作正常,直到我添加实体文件到它。 出现以下错误: 从“typeorm”导入{Entity,Column,PrimaryGeneratedColumn}; ^^^^^^ 无法在模块外使用导入语句 我错过了什么? 添加实体到模块: 应用程序。单元ts:

  • 我有一个实体像下面在Nestjs应用程序与typeorm为mongoDB: 我的其他实体扩展了审计,在我的应用程序中,我使用jwt来验证用户。 问题是,当我想保存一个实体,我不知道如何设置createdBy与@Before插入钩子... 我知道请求中有用户,但我不知道将用户引入方法的正确方法是什么?

  • 这里的文件如下: 当涉及到应用程序的单元测试时,我们通常希望避免建立数据库连接,保持测试套件的独立性并尽可能快地执行它们。但是我们的类可能依赖于从连接实例中提取的存储库。我们如何处理?解决方案是创建模拟存储库。为了实现这一点,我们建立了自定义提供者。每个注册的存储库都由存储库令牌自动表示,其中EntityName是实体类的名称。 @nestjs/typeorm包公开了getRepositoryTo

  • 我使用NestJS与TypeOrm连接在MySQL,但返回一个错误:'没有存储库的"用户"被发现。看起来这个实体没有注册在当前的“默认”连接中?' 没有TypeOrm,我可以运行服务器。 “用户”是我的实体。 app.module 使用者单元 user.entity 谁能告诉我怎么了? 谢谢你的帮助!

  • 我已经为创建新表和更新后端的TypeORM实体苦苦挣扎了一周。我们将NestJS、GraphQL和TypeORM与PSQL数据库一起使用。我们有一个生产服务器/数据库设置,客户信息已经保存。我正在尝试使用代码优先的方法向数据库中添加一个新表来生成模式。在repo的主分支上,我在本地环境中启动它,并连接到一个干净的数据库。创建帐户并将信息保存到表后,我将切换到一个新分支,该分支包含用于实现新表的代码

  • 我正在尝试使用NestJS和TypeORM为我的数据库设置种子。 我有一个迁移文件,它创建了一个表,还有一个种子文件,它将一个插入到表中。这些文件的主要区别是迁移文件直接运行查询: 当种子文件获取存储库时: 这个是产生错误的那个。 在一个服务中,我获得了存储库并保存了实体,没有任何问题。问题只在播种时发生。 我注册打字格式如下: 哪里: 我正在使用使用以下网页配置编译和服务应用程序: 我的结构最终