找不到Role#users的实体元数据

时间:2019-06-20 19:58:29

标签: typeorm type-graphql

尝试与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进程。

7 个答案:

答案 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