我目前陷入一个问题,我不知道该如何解决:
在我的NestJS应用程序中,我想使我的所有TypeORM Entities
扩展一个BaseEntity
类,该类提供一些常规功能。例如,我想提供一种额外的getHashedID()
方法,该方法对我的API客户的内部ID进行哈希处理(并因此隐藏)。
通过HashIdService
完成哈希处理,该方法提供了encode()
和decode()
方法。
我的设置如下所示(为了方便阅读,移除了Decorators!)
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
应该具有返回其哈希ID的getHashedId()
方法。由于我不想“一遍又一遍”执行此操作,因此我想在“隐藏”此方法中如上所述的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
非常感谢您的帮助!
答案 0 :(得分:1)
如果您不需要注入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 = 'tony.stark@avenge.com';
console.log(user.hashedId);
//a1b2c3d4e5f6g7h8i9j0...
答案 1 :(得分:0)
我找到的解决方案是:
在配置服务中,使用:
constructor(filePath: string) {
const dotenvPath = path.join(__dirname, '../../env', filePath);
const config = dotenv.parse(fs.readFileSync(dotenvPath, 'utf8'));
dotenv.config({
path: dotenvPath,
});
this.envConfig = this.validateInput(config);
}
dotenv.config
部分将设置process.env
中env文件中的所有变量,然后在util函数中使用它们。