LoopBack 4中如何实现loopback-ds-timestamp-mixin?配置问题咨询
在LoopBack 4中实现自动添加createdAt/updatedAt字段的方案
我刚帮朋友解决过类似的问题,LoopBack 4确实和v3的结构差异很大,没有了model-config.json这类配置文件,不过咱们可以用它的装饰器、生命周期钩子或者Mixin机制来实现需求,下面是两种常用的靠谱方案:
方案一:创建基础实体类(推荐,简单易维护)
这种方式是定义一个包含时间字段和自动赋值逻辑的基础类,让所有业务模型都继承它,这样每个模型都会自动拥有createdAt和updatedAt字段。
1. 编写基础实体类
在src/models/目录下创建base-entity.model.ts文件:
import {Entity, model, property, beforeSave} from '@loopback/repository'; @model() export class BaseEntity extends Entity { @property({ type: 'date', defaultFn: 'now', // 默认值为当前时间 jsonSchema: { nullable: false, }, }) createdAt?: Date; @property({ type: 'date', defaultFn: 'now', jsonSchema: { nullable: false, }, }) updatedAt?: Date; // 生命周期钩子:保存前自动设置时间 @beforeSave() static setTimestamps(entity: BaseEntity) { const now = new Date(); // 创建时设置createdAt,更新时不修改它 if (!entity.createdAt) { entity.createdAt = now; } // 每次保存(创建/更新)都刷新updatedAt entity.updatedAt = now; } constructor(data?: Partial<BaseEntity>) { super(data); } }
2. 让业务模型继承基础类
比如你有一个Product模型,修改它的代码让它继承BaseEntity:
import {model, property} from '@loopback/repository'; import {BaseEntity} from './base-entity.model'; @model() export class Product extends BaseEntity { @property({ type: 'number', id: true, generated: true, }) id?: number; @property({ type: 'string', required: true, }) name: string; // 其他业务字段... constructor(data?: Partial<Product>) { super(data); } }
这样所有继承BaseEntity的模型都会自动带上时间字段,并且在创建/更新时自动赋值。
方案二:使用Mixin(灵活适配不同模型)
如果有些模型不需要继承基础类,或者你想更灵活地给指定模型添加时间字段,可以用LoopBack 4的Mixin机制。
1. 编写Timestamp Mixin
在src/mixins/目录下创建timestamp.mixin.ts文件:
import {Model, model, property, beforeSave} from '@loopback/repository'; // 辅助类型定义,用于约束Mixin的父类 type Constructor<T = {}> = new (...args: any[]) => T; export function TimestampMixin<T extends Constructor<Model>>(superClass: T) { @model() class TimestampedModel extends superClass { @property({ type: 'date', defaultFn: 'now', jsonSchema: {nullable: false}, }) createdAt?: Date; @property({ type: 'date', defaultFn: 'now', jsonSchema: {nullable: false}, }) updatedAt?: Date; @beforeSave() static setTimestamps(entity: TimestampedModel) { const now = new Date(); if (!entity.createdAt) { entity.createdAt = now; } entity.updatedAt = now; } constructor(...args: any[]) { super(...args); } } return TimestampedModel; }
2. 在模型中应用Mixin
比如给User模型添加时间字段,修改模型代码:
import {model, property} from '@loopback/repository'; import {TimestampMixin} from '../mixins/timestamp.mixin'; @model() export class User extends TimestampMixin(Model) { @property({ type: 'number', id: true, generated: true, }) id?: number; @property({ type: 'string', required: true, }) email: string; // 其他业务字段... constructor(data?: Partial<User>) { super(data); } }
这样User模型就会自动拥有时间字段和自动赋值逻辑,其他模型可以按需选择是否应用这个Mixin。
内容的提问来源于stack exchange,提问作者akhmadodi
相关产品推荐
相关产品推荐

