Используя Loopback 4, я хочу использовать типобезопасность Typescript в моем коде приложения при получении проверки схемы из декораторов репозитория, но сохранить свойство как сериализованный json (в данном случае Postgres bson) вместо отдельного объекта с отношение FK.
Рассмотрим модель Contact
с адресной книгой, в которой может быть список телефонных номеров:
@model()
export class PhoneNumber {
@property({ required: true })
number: string;
@property()
type: string;
}
@model()
export class Contact extends Entity {
@property({ id: true, required: true })
id: string;
@property({ required: true })
email: string;
@property({ required: true })
name: string;
@property.array(PhoneNumber)
phoneNumbers: PhoneNumber[];
constructor(data?: Partial<Contact>) {
super(data);
}
}
В приведенном выше примере я получаю полную проверку схемы, но если я пытаюсь сохранить экземпляр Contact
, используя сгенерированный Repository
, расширяющий DefaultCrudRespository
, он просто удаляет все, что было предоставлено в поле phoneNumbers
, и сохраняет пустой столбец в базе данных.
Если я изменю аннотацию свойства на:
@property.array(Object)
phoneNumbers: PhoneNumber[];
Он правильно сохранит поле, сериализованное как json, но не будет пытаться проверить поле, а также не будет указывать тип как массив PhoneNumber
в сгенерированной спецификации openapi.json.
Похоже, что в Loopback 3 была поддержка встроенных моделей: https://loopback.io/doc/en/lb3/Embedded-models-and-relations.html
Однако в документации Loopback 4 об этом нет упоминания.
Попробуйте использовать фильтр строгого режима в модели PhoneNumber.
@model({settings: {strict: "filter"}})
Это заставит любое неизвестное поле игнорироваться при добавлении в базу данных.
Я думаю, что проблема, с которой вы столкнулись, частично вызвана проблемой, описанной здесь: github.com/strongloop/loopback-next/issues/2130 Однако я подозреваю, что есть нечто большее, я думаю, нам нужно исправить способ, которым LB4 преобразует свойства массива из определений LB4 в определения LB3 / juggler. Не могли бы вы открыть новый выпуск на GitHub?