SAPPER - MikroORM:循环依赖,初始化前无法访问'Person'



我无法与microorm建立关系

我一直得到这个错误

ReferenceError: Cannot access 'Person' before initialization
at Object.<anonymous> (/Users/mauroinsacco/Documents/tests/svelte/my-site/__sapper__/dev/server/server.js:74:31)
at Module._compile (node:internal/modules/cjs/loader:1108:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1137:10)
at Module.load (node:internal/modules/cjs/loader:973:32)
at Function.Module._load (node:internal/modules/cjs/loader:813:14)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:76:12)
at node:internal/main/run_main_module:17:47

这是问题所在的源代码,它们相互依赖


import { Connection, IDatabaseDriver, MikroORM } from "@mikro-orm/core";
import { Entity, Property, OneToOne, PrimaryKey } from "@mikro-orm/core";
export class BaseEntity {
@PrimaryKey()
id!: number;
}
@Entity()
export class Account extends BaseEntity {
@Property()
username: string;
@OneToOne(() => "Person", "account")
person: Person;
}
@Entity()
export class Person extends BaseEntity {
@Property()
name!: string;
@OneToOne("Account")
account: Account;
constructor() {
super();
}
}
export let orm: MikroORM<IDatabaseDriver<Connection>>;
export async function initDatabase() {
orm = await MikroORM.init({
entities: [Person, Account],
dbName: "postgres",
type: "postgresql", // one of `mongo` | `mysql` | `mariadb` | `postgresql` | `sqlite`
clientUrl: "connectionstring", // defaults to 'mongodb://localhost:27017' for mongodb driver
});
}

生成的build/devbuild输出

class BaseEntity {
}
__decorate([
core.PrimaryKey(),
__metadata("design:type", Number)
], BaseEntity.prototype, "id", void 0);
let orm;
let Account = class Account extends BaseEntity {
};
__decorate([
core.Property(),
__metadata("design:type", String)
], Account.prototype, "username", void 0);
__decorate([
core.OneToOne(() => "Person", "account"),
__metadata("design:type", Person) // <------------ IT CRASHES HERE, PERSON IS NOT DEFINED
], Account.prototype, "person", void 0);
Account = __decorate([
core.Entity()
], Account);
let Person = class Person extends BaseEntity {
constructor() {
super();
}
};
__decorate([
core.Property(),
__metadata("design:type", String)
], Person.prototype, "name", void 0);
__decorate([
core.OneToOne("Account"),
__metadata("design:type", Account)
], Person.prototype, "account", void 0);
Person = __decorate([
core.Entity(),
__metadata("design:paramtypes", [])
], Person);

我使用默认的sapper rollup配置和默认的typescript配置,并添加了"experimentalDecorators": true, "emitDecoratorMetadata": true, "esModuleInterop": true

我似乎在网上找不到任何解决方案,我不知道是sapper问题还是rollup问题,也不知道该碰什么,任何帮助都是非常感谢的

局部变量Person在下面定义,然后使用。

__metadata("design:type", Person) // <------------ IT CRASHES HERE, PERSON IS NOT DEFINED
...
let Person = class Person extends BaseEntity {
constructor() {
super();
}
};

您也可以尝试使用IdentifiedReference<Person>IdentifiedReference<Account>类型。

看到https://mikro-orm.io/docs/entity-references/what-is-identifiedreference

对于遇到此问题的任何人:使用此处描述的Rel包装器

import { Rel } from '@mikro-orm/core';
@Entity()
export class Book {
@ManyToOne(() => Author)
author!: Rel<Author>; // <<<---- this one is your friend
}

我认为你需要用@Entity()来装饰BaseEntity

最新更新