首页 > 解决方案 > 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);
  }
}

但是,如果我调用该this.hashids.encode()方法,它会引发异常:

Cannot read property 'encode' of undefined

我怎样才能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

非常感谢您的帮助!

标签: dependency-injectionentitynestjs

解决方案


如果您不需要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;
    }
}

用户.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 = 'tony.stark@avenge.com';

console.log(user.hashedId);
//a1b2c3d4e5f6g7h8i9j0...

推荐阅读