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

时间:2019-01-09 12:37:01

标签: nestjs typeorm

我正在尝试使用在项目外部定义的类型orm实体。也就是说,我有两个项目:模型和core-api。模型是一个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://stackoverflow.com/a/54191513/3943197https://stackoverflow.com/a/54191513/3943197default" connection?

由于我不了解它的工作原理,我对如何遵循它完全迷失了。我看到了typeorm和@ nestjs / typeorm的代码,但我不知道如何解决它。

谢谢!

更新: 我可以通过添加实体类而不是像@serianox这样的路径来使其工作。同样,something/models npm软件包将导出一个独立的嵌套模块。此模块导入/导出包上定义的实体。因此,我可以将实体注入到主应用程序中。

3 个答案:

答案 0 :(得分: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 {}

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

=ARRAYFORMULA(IFNA(VLOOKUP(IFNA(REGEXEXTRACT(A2:A&"", 
 TEXTJOIN("|", 1, SORT(Sheet1!F2:F, 1, 0)))), Sheet1!F2:G, 2, 0)))

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

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

我希望对您有帮助

欢呼