NestJS中如何在抽象类中注入依赖?继承后属性未定义问题
问题描述
我定义了一个抽象服务类:
abstract class AbstractService { @InjectConnection() connection: Connection }
UserService 继承该抽象类后,无法访问 connection 属性(值为undefined):
class UserService extends AbstractService { async get () { this.connection // undefined } }
但如果直接在 UserService 中注入 connection,就能正常获取到Mongoose连接:
class UserService { @InjectConnection() connection: Connection async get () { this.connection // mongoose connection } }
控制器调用 UserService 的代码如下:
@Controller(ROUTER.USER) export class UserController{ constructor(private readonly service: UserService) { } @Get() get() { return this.service.get } }
请问如何解决继承抽象类时依赖注入失效的问题?
解决方案
在NestJS中,装饰器不会自动被子类继承,因此抽象类中的@InjectConnection()注解无法在子类中生效。可通过以下两种方式解决:
方法一:构造函数传递依赖
修改抽象类和子类,通过构造函数注入并传递依赖,这是最可靠的方式:
abstract class AbstractService { constructor(protected connection: Connection) {} } class UserService extends AbstractService { constructor(@InjectConnection() connection: Connection) { super(connection); } async get () { this.connection // 可正常获取连接 } }
父类用protected修饰connection,让子类能直接访问;子类手动注入依赖后传递给父类构造函数,确保依赖被正确初始化。
方法二:为抽象类添加@Injectable()并启用元数据继承
在抽象类上添加@Injectable()装饰器,同时确保项目tsconfig.json中开启了emitDecoratorMetadata选项:
import { Injectable } from '@nestjs/common'; @Injectable() abstract class AbstractService { @InjectConnection() protected connection: Connection } @Injectable() class UserService extends AbstractService { async get () { this.connection // 可正常获取连接 } }
注:部分场景下装饰器元数据可能无法完全继承,此时优先使用方法一。
内容的提问来源于stack exchange,提问作者vy.pham
相关产品推荐
相关产品推荐

