我正在尝试使用 TypeORM进行基本设置,并在设置后收到此错误。
这是一个 REPL(只需执行yarn install && yarn db:dev
以下操作yarn db:migrate && yarn start
即可重现错误)
Inserting a new user into the database...
{ EntityMetadataNotFound: No metadata for "User" was found.
at new EntityMetadataNotFoundError (/Users/admin/work/typeorm-naming-strategy/src/error/EntityMetadataNotFoundError.ts:9:9)
at Connection.getMetadata (/Users/admin/work/typeorm-naming-strategy/src/connection/Connection.ts:313:19)
at /Users/admin/work/typeorm-naming-strategy/src/persistence/EntityPersistExecutor.ts:77:55
at Array.forEach (<anonymous>)
at EntityPersistExecutor.<anonymous> (/Users/admin/work/typeorm-naming-strategy/src/persistence/EntityPersistExecutor.ts:71:30)
at step (/Users/admin/work/typeorm-naming-strategy/node_modules/typeorm/persistence/EntityPersistExecutor.js:32:23)
at Object.next (/Users/admin/work/typeorm-naming-strategy/node_modules/typeorm/persistence/EntityPersistExecutor.js:13:53)
at /Users/admin/work/typeorm-naming-strategy/node_modules/typeorm/persistence/EntityPersistExecutor.js:7:71
at new Promise (<anonymous>)
at __awaiter (/Users/admin/work/typeorm-naming-strategy/node_modules/typeorm/persistence/EntityPersistExecutor.js:3:12)
name: 'EntityMetadataNotFound',
message: 'No metadata for "User" was found.' }
Run Code Online (Sandbox Code Playgroud)
小智 27
就我而言,我忘记将新实体(在您的情况下为 User )添加到 app.module.ts 。这是对我有用的解决方案:
// app.module.ts
@Module({
imports: [
TypeOrmModule.forRoot({
...
entities: [User]
...
}),
...
],
})
Run Code Online (Sandbox Code Playgroud)
Ish*_*mad 19
添加答案有点晚,但它是非常常见的错误。
上述错误有两个主要原因。在 OrmConfig 中,
entities: [__dirname + '/../**/*.entity.ts'] <-- Wrong
Run Code Online (Sandbox Code Playgroud)
它应该是
entities: [__dirname + '/../**/*.entity.js']
Run Code Online (Sandbox Code Playgroud)
小智 15
如果您的应用程序使用最新的 DataSource 而不是 OrmConfig (例如使用最新版本的 typeorm 的应用程序(我写这些行时为 0.3.1)),请确保initialize()
在数据源中调用 DataSource 对象的方法。 ts 文件,然后再在应用程序中的任何位置使用它。
小智 12
问题出在 ormConfig
请尝试使用这个:
entities: [__dirname + '/../**/*.entity.{js,ts}']
Run Code Online (Sandbox Code Playgroud)
小智 10
就我而言,我将一个 EmployeeSchema 更改为 EmployeeEntity,但我忘记了它的实体注释:
@Entity()
export class Employee {
Run Code Online (Sandbox Code Playgroud)
小智 5
以下将确保 TypeORM 使用的文件扩展名都是 .js 和 .ts
entities: [__dirname + '/../**/*.entity.{js,ts}']
Run Code Online (Sandbox Code Playgroud)
在你的配置文件中更改它。
小智 5
在 app.module.ts 中启用 autoLoadEntities
imports: [UserModule,
TypeOrmModule.forRoot({
autoLoadEntities: true
})
]
Run Code Online (Sandbox Code Playgroud)
在使用实体之前,请确保您已与数据库建立连接。就我而言,我在AppDataSource
初始化之前使用了它。这是我修复它的方法:
import "reflect-metadata";
import { DataSource } from "typeorm";
import { Season } from "src/models/Season";
const AppDataSource = new DataSource({
type: "postgres",
host: "localhost",
port: 5432,
username: "postgres",
password: "postgres",
database: "test-db",
synchronize: false,
logging: false,
entities: [Season],
migrations: [],
subscribers: [],
});
AppDataSource.initialize()
.then(async () => {
console.log("Connection initialized with database...");
})
.catch((error) => console.log(error));
export const getDataSource = (delay = 3000): Promise<DataSource> => {
if (AppDataSource.isInitialized) return Promise.resolve(AppDataSource);
return new Promise((resolve, reject) => {
setTimeout(() => {
if (AppDataSource.isInitialized) resolve(AppDataSource);
else reject("Failed to create connection with database");
}, delay);
});
};
Run Code Online (Sandbox Code Playgroud)
在您想要使用数据源的服务中:
import { getDataSource } from "src/config/data-source";
import { Season } from "src/models/Season";
const init = async (event) => {
const AppDataSource = await getDataSource();
const seasonRepo = AppDataSource.getRepository(Season);
// Your business logic
};
Run Code Online (Sandbox Code Playgroud)
如果需要,您还可以扩展我的函数以添加重试逻辑:)
我相信我的问题是由于意外同时拥有 ormconfig.json 和 ormconfig.ts 引起的
归档时间: |
|
查看次数: |
14737 次 |
最近记录: |