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,。。。。。])
但是要注意模型顺序