如果配置文件中未设置实体目录,则 TypeORM 找不到实体



我正在使用TypeORM和休耕配置文件:ormconfig.json

{
"type": "mysql",
"host": "localhost",
"port": 3306,
"username": "root",
"password": "my-secret-pw",
"database": "mytestdb",
}

我的实体文件存储在 ./src/bar/entity 目录中。 我总是收到以下错误:

RepositoryNotFoundError: 找不到"myTable"的存储库。看起来此实体未在当前"默认"连接中注册?

当我手动将目录添加到配置文件时,会找到该实体:

{
...
"entities": ["src/bar/entity/**/*.ts"]
}

我的实体定义如下:

@Entity('myTable')
export default class MyTable {
@PrimaryGeneratedColumn()
public id: number;
...

如何允许 TypeORM 查找这些实体,而无需在每个目录的配置文件中手动设置?

您描述的最常见的情况是具有仅由实体声明组成的单独entities目录。

{
...
"entities": ["src/bar/entities/**/*.ts"]
}

另一种方法是单独导入每个实体:

import {User} from "./payment/entity/User";
import {Post} from "./blog/entity/Post";
{
...
"entities": [User, Post]
}

对我来说,它还有助于包含src目录以ormconfig.json

"entities": [
"dist/**/*.entity{.ts,.js}",
"src/**/*.entity{.ts,.js}"
],

对我来说,答案是 { ... entities: [join(__dirname, '/../**/**.entity{.ts,.js}')], }

我在这里找到了示例 https://github.com/nestjs/nest/blob/master/sample/05-sql-typeorm/src/app.module.ts

如果您不想将所有实体放在同一个位置(即如果您有模块文件夹并希望将实体放在其关联的模块文件夹中(,并且如果您使用的是文件命名约定,如foo.entity.tsfoo.service.ts等,那么您可以执行以下操作,它将找到所有实体,无论它们在源代码树中的哪个位置:

{
...
"entities": ["src/**/*{.entity.ts}"],
}

使用 Nest.js为了同时适用于开发和生产环境,我必须这样做:

entities: [
this.isProduction() ? 
path.join(__dirname, '../**/**.entity{.ts,.js}') : '**/*.entity{.ts,.js}',
],
// ....
private isProduction(): boolean {
const mode = this.configService.get('NODE_ENV');
return mode !== 'development';
}

我的问题是我的用户实体文件是小写的,当我大写它时 - 一切都有效。

这对我有用。

entities: [
path.join(
__dirname,
process.env.NODE_ENV === 'development' ?
'/**/*.entity{.ts,.js}' :
'/**/*.entity.js', // afaik building stuffs are js-only
),
]
/../**/*.entity.{ts,js}

它对我有用。基本上,在dist中,它正在寻找实体。但是在我给 ts 的配置中,这就是它不起作用的原因。确保同时添加了 TS 和 JS 扩展

要利用 Nest.JS 模块化,可以使用自动加载实体功能。

以这种方式将实体放置在相应的模块文件夹中,以保持关注点分离。

若要启用它,必须设置 Typeform 配置对象的autoloadEntities: true属性。

只需做:

//app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
imports: [
TypeOrmModule.forRoot({
...
autoLoadEntities: true,
}),
],
})
export class AppModule {}

然后模块实体应该通过forFeature()注册。

//user.module.ts
@Module({

imports: [
/* Here, User and ForgotPasswordToken entities are being registered */
TypeOrmModule.forFeature([User, ForgotPasswordToken])
],
providers: [UsersService],
controllers: [UsersController],
})
export class UsersModule {}

不包括未通过forFeature()方法注册的实体。

有关更多详细信息,请参阅 NestJS 文档。

确保实体文件的名称不是复数形式。例如,如果您正在创建一个发布实体文件,它不应该是"posts.entity.ts",而应该是"post.entity.ts">

最新更新