В настоящее время я застрял над проблемой, которую я не знаю, как решить:
В моем приложении NestJS я хотел бы, чтобы все мои TypeORM Entities расширяли класс BaseEntity, который предоставляет некоторые общие функции. Например, я хотел бы предоставить дополнительный метод getHashedID(), который хеширует (и, следовательно, прячется) внутренний идентификатор от моих клиентов API.
Хеширование выполняется с помощью HashIdService, который предоставляет методы encode() и decode().
Моя установка выглядит так (убраны декораторы для удобства чтения!):
export class User extends BaseEntity {
id: int;
email: string;
name: string;
// ...
}
export class BaseEntity {
@Inject(HashIdService) private readonly hashids: HashIdService;
getHashedId() {
return this.hashids.encode(this.id);
}
}
Однако, если я вызываю метод this.hashids.encode(), он генерирует исключение с:
Cannot read property 'encode' of undefined
Как я могу преобразовать услугу в класс inject? Это вообще возможно?
ОБНОВЛЕНИЕ # 1
В частности, я хотел бы «вставить» entity/model в свой HashIdService. Кроме того, Entities должен иметь метод Entities, который возвращает их хешированный идентификатор. Поскольку я не хочу делать это «снова и снова», я хотел бы «спрятать» этот метод в getHashedId(), как описано выше.
Моя текущая версия NestJS выглядит следующим образом:
Nest version:
+-- @nestjs/[email protected]
+-- @nestjs/[email protected]
+-- @nestjs/[email protected]
+-- @nestjs/[email protected]
+-- @nestjs/[email protected]
Спасибо большое за помощь!
@JesseCarter Может быть, ему нужно что-то вроде доступа к БД, которая в противном случае вводится?
@JesseCarter Я только что обновил свой первоначальный вопрос. Я хотел бы внедрить HashIdService, чтобы мои объекты могли хешировать свой собственный идентификатор. Как бы вы решили эту проблему? Что вы имеете в виду под «функцией полезности»?
Вам необходимо вручную настроить сервис, если вы хотите использовать его в модели.
Вы рассматривали возможность расширения BaseEntity, а затем использовать расширенную версию?


Если вам не нужно вводить HashIdService или имитировать его в модульном тесте, вы можете просто сделать это:
BaseEntity.ts
import { HashIdService } from './HashIdService.ts';
export class BaseEntity {
public id: number;
public get hasedId() : string|null {
const hashIdService = new HashIdService();
return this.id ? hashIdService.encode(this.id) : null;
}
}
User.ts
export class User extends BaseEntity {
public email: string;
public name: string;
// ...
}
Затем создайте своего пользователя:
const user = new User();
user.id = 1234;
user.name = 'Tony Stark';
user.email = '[email protected]';
console.info(user.hashedId);
//a1b2c3d4e5f6g7h8i9j0...
Это становится чрезвычайно трудным / невозможным, если HashIdService также имеет цепочку DI.
Почему необходимо, чтобы эта конкретная служба вводилась, а не просто ссылалась на служебную функцию?