Sequelize TypeScript下HasOne/HasMany关联的logs、size字段无法存储问题
问题原因及解决方案
导致关联字段logs、size无法保存的常见原因及对应修复方案如下:
- 原因1:
create方法未开启关联保存配置
sequelize默认不会在创建主模型时自动保存关联模型数据,需要手动指定要关联创建的模型。
修复方案:修改服务层的create调用,添加include参数:
try { return this.errorModel.create(saveData, { include: [Log, Size] }) } catch (err) { throw new HttpException('Error model save', HttpStatus.NOT_ACCEPTABLE); }
- 原因2:关联模型的外键配置错误
当前Log、Size模型将外键errorId同时设置为了自增主键,该配置会导致关联逻辑失效:errorId是指向Error表_id的外键,不能作为自身的自增主键,数据库会自动生成自增的errorId值,无法和Error表的记录关联。
修复方案:给Log、Size模型添加独立的主键字段,移除errorId的主键、自增、唯一装饰器:
// Log模型修改示例 @Table({modelName: 'logs'}) export class Log extends Model<Log, ILog> { // 新增独立主键 @PrimaryKey @AutoIncrement @Column({type: DataType.INTEGER}) id: number // errorId仅作为外键 @ForeignKey(() => Error) @Column({type: DataType.INTEGER}) errorId: number @Column x: number @Column y: number @BelongsTo(() => Error) error: Error }
Size模型按照同样逻辑修改即可。
- 原因3:服务层未处理size字段
当前服务层代码仅对logs字段做了赋值处理,未将请求传入的size字段同步到saveData中,导致size数据根本没有传入create方法。
修复方案:在服务层添加size字段的赋值逻辑:
if (errorDto.logs) saveData.logs = errorDto.logs.map(({x, y}: {x: number, y:number}) => ({x, y})) // 新增size处理逻辑 if (errorDto.size) saveData.size = errorDto.size
- 原因4:size字段结构不匹配
你描述的size格式为{key: ""},但ICreateSize接口和Size模型要求的字段是width、height、vHeight,结构不匹配也会导致数据无法正常写入。需要确保传入的size字段符合模型定义的字段结构。
内容的提问来源于stack exchange,提问作者Mr. Byte
相关产品推荐
相关产品推荐

