我正在学习 Udemy 的 NestJS 课程 https://www.udemy.com/course/nestjs-zero-to-hero。
我遇到了一个奇怪的问题,我尝试了很多方法,但似乎没有任何效果。这是我的问题和完整代码。
我遇到的错误
我的ORM配置文件:
面临这个问题的人们已经通过不同的修复解决了它,
我已尝试了互联网上提供的所有可能的解决方案,但无法解决此问题。已经好几天了,我正在寻找堆栈溢出方面的帮助或救星。
同时,我会尝试查看更多可能有帮助的可能性,但如果您遇到此问题,请告诉我可能的解决方案。
entities: [__dirname + '/../**/*.entity.ts']
到
entities: [__dirname + '/../**/*.entity.js']
在 typeorm.config.ts
对我有效
在 NestJS 中添加
.js
并排 .ts
对我有用
typeorm.config.ts
之前
import { TypeOrmModuleOptions } from '@nestjs/typeorm';
export const TypeORMConfig: TypeOrmModuleOptions = {
type: 'postgres',
url: process.env.DATABASE_URL,
synchronize: true,
entities: [__dirname + '/../**/*.entity.ts'],
migrationsTableName: 'Migrations_History',
};
之后
import { TypeOrmModuleOptions } from '@nestjs/typeorm';
export const TypeORMConfig: TypeOrmModuleOptions = {
type: 'postgres',
url: process.env.DATABASE_URL,
synchronize: true,
entities: [__dirname + '/../**/*.entity{.ts,.js}'],
migrationsTableName: 'Migrations_History',
};
我也遇到过同样的问题。在尝试了此处提到的所有其他对我不起作用的解决方案后,我通过添加以下选项修改了 typeorm.config.ts 文件:
autoLoadEntities: true,
这已经解决了问题。
该错误是由打字稿引起的 如果您设置 typeOrmCOnfig 就像这样
编译后使用文件,即使用dist/*.js
您正在扩展 BaseEntity,这并不意味着它将 @Entity 注释放置到您的实体类中。它的使用基本上就像您希望每个实体都拥有的某些数据字段一样。
它的内部实现如下所示:-
// base.entity.ts
import { PrimaryGeneratedColumn, Column, UpdateDateColumn, CreateDateColumn } from 'typeorm';
export abstract class BaseEntity {
@PrimaryGeneratedColumn('uuid')
id: string;
@Column({ type: 'boolean', default: true })
isActive: boolean;
@Column({ type: 'boolean', default: false })
isArchived: boolean;
@CreateDateColumn({ type: 'timestamptz', default: () => 'CURRENT_TIMESTAMP' })
createDateTime: Date;
@Column({ type: 'varchar', length: 300 })
createdBy: string;
@UpdateDateColumn({ type: 'timestamptz', default: () => 'CURRENT_TIMESTAMP' })
lastChangedDateTime: Date;
@Column({ type: 'varchar', length: 300 })
lastChangedBy: string;
@Column({ type: 'varchar', length: 300, nullable: true })
internalComment: string | null;
}
因此这将生成一个 uuid id 字段和/或一个 createDateTime-、lastChangedDateTime 字段。
注意:这些基类应该是抽象的。
所以你必须在每个实体类的开头放置@Entity注释
还可以更改导入顺序,例如首先导入 TypeOrmModule,然后导入 TaskModule。
希望能有所帮助。
@Module({
imports: [
TasksModule,
TypeOrmModule.forRoot({
type: 'postgres',
host: 'localhost',
port: 5432,
username: 'postgres',
password: 'postgres',
database: 'userdata',
autoLoadEntities: true,
synchronize: true,
}),
],
})
export class AppModule { }
根据 typeOrm 官方文档 从目录加载所有实体在使用 ts-node 时要小心这种方法。 outDir 可能指向与实体所在位置不同的位置/文件,从而导致上述错误。您需要指定 outDir 目录中 .js 文件的路径。
将实体设置为:
entities: [__dirname + '../**/*.entity{.ts,.js}']
像这样设置你的实体:
entities: ['dist/src/**/*.entity{.ts,.js}'],
In my case I add the Entity itself in DataSource entities array, and worked
import { Device } from "@core/entities/device";
import { User } from "@core/entities/user";
export const AppDataSource = new DataSource({
type: "postgres",
url: process.env.POSTGRES_URL_NON_POOLING,
entities: [Device, User], // <--------
logging: true,
});