NestJS:将服务注入模型/实体

zor*_*orn 9 entity dependency-injection nestjs

我目前被困在一个问题上,我不知道如何解决:

在我的 NestJS 应用程序中,我想让我的所有TypeORM Entities扩展BaseEntity类都提供一些通用功能。例如,我想提供一种额外的getHashedID()方法来散列(并因此隐藏)我的 API 客户的内部 ID。

散列是由 a 完成的HashIdService,它提供了一个encode()anddecode()方法。

我的设置看起来像这样(删除了装饰器以提高可读性!):

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我调用该this.hashids.encode()方法,它会抛出一个异常:

Cannot read property 'encode' of undefined
Run Code Online (Sandbox Code Playgroud)

我怎样才能把inject一个服务变成一个entity/model类?这甚至可能吗?

更新 #1 特别是,我想“注入”HashIdService到我的Entities. 此外,Entities应该有一个getHashedId()方法来返回他们的散列 ID.. 因为我不想“一遍又一遍”地做这个,我想在BaseEntity上面描述的“隐藏”这个方法..

我目前的 NestJS 版本如下:

Nest version:
+-- @nestjs/common@5.4.0
+-- @nestjs/core@5.4.0
+-- @nestjs/microservices@5.4.0
+-- @nestjs/testing@5.4.0
+-- @nestjs/websockets@5.4.0
Run Code Online (Sandbox Code Playgroud)

非常感谢您的帮助!

ner*_*ast 2

如果您不需要HashIdService在单元测试中注入或模拟它,您可以简单地执行以下操作:

基础实体.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;
    }
}
Run Code Online (Sandbox Code Playgroud)

用户.ts

export class User extends BaseEntity {
    public email: string;
    public name: string;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

然后创建您的用户:

const user = new User();
user.id = 1234;
user.name = 'Tony Stark';
user.email = 'tony.stark@avenge.com';

console.log(user.hashedId);
//a1b2c3d4e5f6g7h8i9j0...
Run Code Online (Sandbox Code Playgroud)

  • 如果 `HashIdService` 也有一个 DI 链,这将变得极其困难/不可能。 (5认同)