我正在使用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.ts
、foo.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">