创建实体实例导致 Reflect.getMetadata 不是函数

Posted

技术标签:

【中文标题】创建实体实例导致 Reflect.getMetadata 不是函数【英文标题】:creating an instance of entity causes Reflect.getMetadata is not a function 【发布时间】:2017-05-03 08:42:32 【问题描述】:

我开始使用 typeorm。我创建了一些实体:

@Table()
export class User 
@PrimaryColumn()
name: string;
@Column()
passwordHash: string;
@OneToMany(type => Sprint, sprint => sprint.scrumMaster)
sprints: Sprint[];
@OneToMany(type => BacklogItem, item => item.assignedTo)
assignments: BacklogItem[];
@OneToMany(type => BacklogItem, item => item.createdBy)
createdItems: BacklogItem[];

@Table()
export class Sprint 
@PrimaryGeneratedColumn()
id: number;
@Column("date")
start: Date;
@Column("date")
end: Date;
@ManyToOne(type => User, user => user.sprints)
scrumMaster: User;
@OneToMany(type => BacklogItem, item => item.sprint)
items: BacklogItem[];
@Column()
isFinished: boolean;

Typeorm 创建数据库(Sqlite)就好了。但是,每当我创建我的一个实体的实例时,例如let = user = new User(),NodeJS 会立即崩溃并显示以下堆栈跟踪:

C:\Users\Chris\Documents\TypeORM - Kopie (2)\node_modules\typeorm\decorator\columns\PrimaryColumn.js:20 var reflectType = ColumnTypes_1.ColumnTypes.typeToString(Reflect.getMetadata("design:type", object, propertyName)); ^

TypeError: Reflect.getMetadata 不是函数 在 C:\Users\Chris\Documents\TypeORM - Kopie (2)\node_modules\typeorm\decorator\columns\PrimaryColumn.js:20:76 在 __decorate (C:\Users\Chris\Documents\TypeORM - Kopie (2)\entities\Sprint.js:5:110) 在对象。 (C:\Users\Chris\Documents\TypeORM - Kopie (2)\entities\Sprint.js:19:1) 在 Module._compile (module.js:541:32) 在 Object.Module._extensions..js (module.js:550:10) 在 Module.load (module.js:456:32) 在 tryModuleLoad (module.js:415:12) 在 Function.Module._load (module.js:407:3) 在 Module.require (module.js:466:17) 在需要(内部/module.js:20:19) 当我删除创建新实例的行时,一切都很好了。我曾尝试使用不同的 PrimaryKey 装饰器,例如 @PrimaryColumn("int", generated: true ),但这无济于事。

编辑:我的 tsconfig.json: “版本”:“2.1”, “编译器选项”: “lib”:[“es5”,“es6”], “目标”:“es5”, “模块”:“commonjs”, "moduleResolution": "节点", “emitDecoratorMetadata”:真, “experimentalDecorators”:是的, “源地图”:是的, “typeRoots”:[“node_modules/@types”] , “排除”: [ “节点模块” ]

提前非常感谢。

【问题讨论】:

【参考方案1】:

确保您使用的是 TypeScript 编译器版本 > 2.1,并且您在 tsconfig.json 中启用了以下设置:

"emitDecoratorMetadata": true,
"experimentalDecorators": true

还要确保在使用 orm 的任何代码之前导入了反射元数据 shim:

import "reflect-metadata";

【讨论】:

我想我拥有一切。 tsc -version 给了我 2.1.4。我使用tsc -p . 来编译我的代码。我还将我的 tsconfig 添加到原始帖子中。 应该可以解决您的问题。尝试检查此示例:github.com/typeorm/typescript-example 运行它并检查它是否有效 样本确实有效。我现在已将我的整个源代码复制到您的示例中,现在它可以工作了。谢谢 它可以工作,但你能解释一下为什么需要这样做吗? 重要的是要注意导入“reflect-metadata”必须是 index.ts 文件中所有其他导入之前的第一个导入语句。【参考方案2】:

样本github.com/typeorm/typescript-example 对我来说很好用。我现在已经将我的整个代码复制到示例项目中,我的问题已经消失了。

【讨论】:

样本工作正常,但这并没有提供任何见解或线索,说明为什么其他人试图解决同样的问题会发生问题。因此,此评论可能是对您的问题的编辑/评论,而不是完整的答案。

以上是关于创建实体实例导致 Reflect.getMetadata 不是函数的主要内容,如果未能解决你的问题,请参考以下文章

使用外键发布新实体会导致创建另一个外部实体而不是引用现有实体

如何创建 Laravel Eloquent 实体的空实例

创建实体框架上下文的实例在负载下减慢

如何根据数据库的字段动态创建实体类? 用java啊~ 最好给点源码和实例

创建一个核心日期实体实例但不希望它被存储(非持久性)

实体框架导致循环引用?