Loopback 4中被mixin包裹的模型如何正确设置数据库表名?
问题原因
Loopback 4 的 @model 装饰器生成的表名、schema 等配置元数据直接绑定在被装饰的原类上。通过 mixin 扩展生成的新类 MyModelWithMixin 未主动继承原模型的配置时,Loopback 会默认将新类名转换为蛇形作为默认表名,因此会尝试访问不存在的 public.mymodelwithmixin 表。
解决方案
方案1:为扩展后的新模型显式指定配置(适合少量使用场景)
直接在生成的新类上叠加 @model 装饰器,复用原有配置即可:
@model({settings: {postgresql: {schema: 'public', table: 'dbtablename'}}}) class MyModelWithMixin extends AuditMixin(MyModel) {}
方案2:修改 AuditMixin 自动继承原模型配置(适合全局复用场景)
调整 mixin 代码,给动态生成的内部类加上 @model 装饰器,自动合并原类的所有模型配置,不需要每个使用的地方重复写配置:
import {MixinTarget} from '@loopback/core'; import {property, model} from '@loopback/repository'; export function AuditMixin<T extends MixinTarget<object>>(baseClass: T) { // 读取原模型的已有配置 const baseModelSettings = baseClass?.definition?.settings ?? {}; @model({ settings: { ...baseModelSettings, inheritBaseModel: true } }) class Mixin extends baseClass { // 注意timestamp要加@property装饰器,否则Loopback不会识别为模型字段 @property({ type: 'date', required: true }) timestamp: Date; constructor(...args: any[]) { // 修正原代码的参数传递错误,要展开args super(...args); this.timestamp = new Date(); } } return Mixin; }
额外提示:原mixin代码有两处小问题:一是
timestamp没有加@property装饰器,不会被识别为模型字段;二是构造函数调用super时没有展开args,会导致原模型属性初始化异常,上面的代码已经修正。
修改后原有使用方式无需调整,即可正常识别原模型配置的表名:
class MyModelWithMixin extends AuditMixin(MyModel) {}
内容的提问来源于stack exchange,提问作者Irfanullah Jan
相关产品推荐
相关产品推荐

