sequelize-typescript 模型关联导致的ReferenceError: Cannot access ‘User’ before initialization 重复引用的临时解决方案

PS D:\xxx\server\dist> node server.js
file:///D:/xxx/server/dist/models/UserProfiles.js:433
    __metadata("design:type", User)
                              ^

ReferenceError: Cannot access 'User' before initialization

今天把之前写的一个nodejs的typescript项目准备去服务器上跑一跑测试一下 遇到这个报错
项目使用了sequelize-typescript来操作mysql 因为sequelize V7好像支持typescript了 但是还是测试版 暂时只能先用这个库
UserProfiles是User的扩展表 因为字段较多 所以做了一对一关联 使用webstorm里的调试 运行都没问题 但是npm run build之后报错
package.json部分内容如下

  "scripts": {
    "start": "tsx src/server.ts",
    "dev": "tsx watch src/server.ts",
    "build": "tsc",
    "test": "echo \"Error: no test specified\" && exit 1"
  },

咱也不知道是配置问题还是咋的 开发过程中一切顺利 build之后就跑不起来
查了很多答案 解决不了 最终的报错锁定在这一行内容

    @BelongsTo(() => User, {foreignKey: 'UserId'})
    declare user: User;

既然是重复引用 那就干脆不引用了。。。琢磨了下 临时解决方案如下 (以后有更好方案了随时更新)

首先 把User模型的默认导出去掉
比如之前是export default class User extends Model 改成export class User extends Model
然后去UserProfiles模型中 改成type引用import type {User} from “./User.js”;
改成这样的话 编辑器应该是会报错的

@BelongsTo(() => User, {foreignKey: 'UserId'})// 这里的User会报错
declare user: User;//这里的User应该没问题

以我这个小白的理解 就是declare中引用的是type类型 而BelongsTo中引用的是模型对象
然后想了想 引用对象的话简单。。。

    @BelongsTo(() => sequelize.model("User"), {foreignKey: 'UserId'})
    declare user: User;

直接这样就搞定了 这里的sequelize是你初始化sequelize的对象

然后居然还报错 说sequelize没有初始化 那就干脆把初始化代码中的models部分去掉 初始化的时候不加载模型 去项目根目录中加上addModels问题解决

sequelize.addModels([User,  UserProfiles,。。。。。])

但是要注意模型顺序

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注