You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:18:03