尝试与typeorm建立OneToMany和ManyToOne关系,但出现此错误,我不知道我的代码有什么问题。
我有一个用户表:
import { BaseEntity, Column, Entity, ManyToOne, PrimaryGeneratedColumn } from 'typeorm';
import { Field, ID, ObjectType } from 'type-graphql';
import { Role } from './';
@ObjectType()
@Entity()
export class User extends BaseEntity {
@Field(() => ID)
@PrimaryGeneratedColumn()
public id: number;
@Field()
@Column('text', { unique: true })
public userName: string;
@Column()
public password: string;
@Field()
@Column('boolean', { default: true })
public isActive: boolean;
@ManyToOne(() => Role, role => role.users)
@Field(() => Role, { nullable: true })
public role: Role;
}
和角色表:
import { BaseEntity, Column, Entity, OneToMany, PrimaryGeneratedColumn } from 'typeorm';
import { Field, ID, ObjectType } from 'type-graphql';
import { User } from '.';
@ObjectType()
@Entity()
export class Role extends BaseEntity {
@Field(() => ID)
@PrimaryGeneratedColumn()
public id: number;
@Field()
@Column('text', { unique: true })
public name: string;
@OneToMany(() => User, user => user.role, { lazy: false })
@Field(() => [User], { nullable: true })
public users: User[];
}
但是我一直收到此错误
(节点:4541)UnhandledPromiseRejectionWarning:错误:实体元数据 找不到Role#users。检查您是否指定了正确的实体 对象以及是否在连接选项中已连接。 [1] /Users/soufiane/projects/pos/node_modules/typeorm/metadata-builder/EntityMetadataBuilder.js:571:23 [1]位于Array.forEach()[1]位于 EntityMetadataBuilder.computeInverseProperties (/Users/soufiane/projects/pos/node_modules/typeorm/metadata-builder/EntityMetadataBuilder.js:567:34) [1] /Users/soufiane/projects/pos/node_modules/typeorm/metadata-builder/EntityMetadataBuilder.js:80:74 [1]位于Array.forEach()[1]位于 EntityMetadataBuilder.build (/Users/soufiane/projects/pos/node_modules/typeorm/metadata-builder/EntityMetadataBuilder.js:80:25) [1]在ConnectionMetadataBuilder.buildEntityMetadatas (/Users/soufiane/projects/pos/node_modules/typeorm/connection/ConnectionMetadataBuilder.js:57:141) [1]在Connection.buildMetadatas (/Users/soufiane/projects/pos/node_modules/typeorm/connection/Connection.js:494:57) [1]在连接处。 (/Users/soufiane/projects/pos/node_modules/typeorm/connection/Connection.js:126:30) [1]在 (/Users/soufiane/projects/pos/node_modules/tslib/tslib.js:136:27)[1] (节点:4541)UnhandledPromiseRejectionWarning:未处理的承诺 拒绝。该错误是由抛出异步内部引起的 没有捕获块或拒绝承诺 未使用.catch()处理。 (拒绝ID:1)[1](节点:4541)[DEP0018] DeprecationWarning:已弃用未处理的承诺拒绝。在 未来,未处理的承诺拒绝将终止 具有非零退出代码的Node.js进程。
答案 0 :(得分:8)
我在PostgreSQL上使用NestJS,但遇到了同样的问题。我的问题是我忘记了使用TypeOrmModule.forFeature
函数将模块中的实体导入。
@Module({
imports: [TypeOrmModule.forFeature([Users, ...])], <--- Importing the entity!
controllers: [...],
providers: [...],
exports: [...],
})
答案 1 :(得分:2)
我遇到了同样的问题。
TypeORM很难在各处使用args和元数据类/集合进行调试。几个小时后,我终于知道了。
所以这种关系失败了,因为EntityMetadataBuilder.ts试图使用“ ===”将ManyToOne列的类型与已知的实体类型联系起来。
var inverseEntityMetadata = entityMetadatas.find(function(m){return m.target === Relation.type ||(typeof related.type ===“ string” && m.targetName === Relation.type); });
查看relationship.type,我可以看到它与m.target是相同的“类型”,但是它们没有指向已定义类型的相同引用。在我看来,我的相关类被节点多次加载了。在了解了节点如何缓存模块之后,我可以通过确保所有导入语句都引用同一文件(包括字符串中的大写/小写字母)来解决问题。
我有一个文件
从“ ./transaction”导入{交易};
和我的另一个
从“ ./Transaction”导入{交易};
注意大写的“ t”。用小写的“ T”替换后,一切正常。
答案 2 :(得分:1)
我的问题是我正在使用node-ts为我的项目仅运行打字稿文件。但是,我的构建仍然发出了被忽略/隐藏的.js文件。我不知道为什么,但是清除* .js和* .js.map编译文件是可行的。奇怪的是我的ormconfig只指定.ts文件。
我建议在tsconfig.json编译器选项中添加"noEmit": true
,以防止将来出现任何麻烦。
答案 3 :(得分:0)
这仅表示您的实体未加载或加载错误
您需要修复实体的加载。实体通常会从ormconfig文件中加载
只需创建一个文件 ormconfig.js 并输入如下内容,即强调实体
module.exports = {
"name": "default",
"type": "mongodb",
"host": "localhost",
"port": "27017",
"username": "root",
"password": "",
"database": "rocketlaunches",
"entities": [
__dirname + "entities/**/*.entity.ts"
]
}
现在,显然,您可以从项目中的任何位置加载实体
答案 4 :(得分:0)
我解决了我的问题
我有一个文件
import { Role} from "./models/category";
答案 5 :(得分:0)
在我的项目中,TypeORM的初始化如下:
import { createConnection } from 'typeorm';
const conn = await createConnection({
// Make sure to specify all entities here
entities: [User, Role],
// ... More options
})
只需确保entities
列出您的所有实体即可。
(如果您不使用ormconfig.js
指定实体,这是替代方法。)
答案 6 :(得分:0)
如果您在应用此处提供的其他解决方案后仍有问题。检查您的实体是否具有 @Entity()
装饰器。我错过了这个,添加它后它解决了问题。
还需要在连接选项中添加 autoLoadEntities: true
。