如何在带有Typescript的nodejs应用中将服务实例注入到路由器使用的控制器实例中

发布时间:2020-07-07 17:52

我是nodejs的新手,所以不确定我使用的模式是最好的。

我有一个服务类,可以访问数据库并进行类似这样的计算

export class MyService {
  async getData(){
     return await collection;
  }
}

export class MyController {
  constructor(private srv: MyService){}
  async getData(){
     return await srv.getData();
  }
}

// CustomRouter

const router = require('express').Router();
import { MyController } from "../controllers/myController";
import { MyService } from "../services/myService";

// Is this vvv right way to do the injection 
const mySrv = new MyService();
const myController = new MyController(mySrv);

router.get("/", myController.getTasks)
 
module.exports = router;

我在一项服务中使用了它,并且运行良好,但是我创建的另一项服务出现问题,告诉我srv中的myController参数未定义。如果我将控制器中的实例方法更改为箭头语法(=>)方法,则this在范围内,并且srv定义并运行良好,但是我很困惑为什么相同的代码在其他服务中也可以运行这是在路由器中注入具有可注入依赖项的控制器的正确方法。

此控制器是否像单例类那样结束并且在所有请求中仅使用一个实例,还是该请求创建了MyController和MyService的新实例?

能够在路由器中注入实例的最佳方法或其他方法是什么

回答1