使用 typescript 和 express 的依赖注入 类

Dependency Injection with typescript and express using classes

我们如何在路由文件中使用依赖注入的概念并在服务器文件中添加?

我尝试在我的节点项目中使用依赖注入,但我认为我走的路不对。我正在尝试将我的 UserService 注入我的 AppRouter。我之前的注册方式是static,但是我改成了public方式,因为static成员不允许我注入依赖。

首先 this.userService.UserRegistrationService 向我显示错误 undefined。请建议正确的方法,因为我是表达和节点的新手。

路由文件

import express from 'express';
import bodyParser = require('body-parser');
import { API } from ".././utilities/api";
import UserService from '../api/services/UserService';
const multer = require('multer');
const upload = multer({ dest: 'uploads/' });
import validationMw from '../api/middlewares/request_validation';
import UserDao from '../api/requests/userDto';
let cors = require('cors');
//let bodyParser = require('body-parser');
 
class AppRouter {

  private userService: UserService;
  public router: express.Router;
  public userObj: any;

  constructor(userService: UserService) {
    this.router = express();
    this.router.use(cors());
    this.AddMiddlewares();
    this.AddRoutes();
   
    this.userService =  userService;
  }

  // Add all middlewares here that will get request before routes.
  AddMiddlewares(): void { //  Used to parse req.body into json object

    this.router.use(bodyParser.json());
    this.router.use(bodyParser.urlencoded({ extended: false }));
    //this.router.use(LogsService.LogRequest);
  }

  AddRoutes(): void {
    console.log(API.RegistrationEmployee);
    this.router.post(API.RegistrationEmployee, this.userService.UserRegistrationService);
  }
}

export default new AppRouter(new UserService).router;

用户服务Class

import { Request, Response } from "express-serve-static-core";
import { isNullOrUndefined, isNull } from "util";
import { logger } from "../../utilities/logger";
import UserController from "../controllers/userController";
import { ProjectConstants, ErrorCodes } from "../../utilities/config";
import {
  ReasonPhrases,
  StatusCodes,
  getReasonPhrase,
  getStatusCode,
} from "http-status-codes";
import ResponseService from "../services/ResponseService";

export default class UserService {

  private userController: UserController;
  
  constructor(userController?: UserController) {
      this.userController = userController;
  }  

  public async UserRegistrationService(req: Request, res: Response) {
    console.log(434);
    // UtilityMethods.ConsoleLog("UserRegisterService - BODY", req.body);
    logger.info("UserRegistration- function call " + JSON.stringify(req.body));
    
    await this.userController.registration(req.body)
      .then((data: any) => {
        // UtilityMethods.ConsoleJSON("03 GetCategoryService", data);
        ResponseService.SendSucessResponse(req, res, data, ErrorCodes.OK);
      })
      .catch(function (err: any) {
        ResponseService.SendErrorResponse(req, res, err);
      });
  }
}

您已经设计了其中一些 类 在它们的构造函数中获取依赖项,但是您需要确保在调用 new.

您在 new AppRouter(new UserService).router 行的 UserService 之后缺少括号。它需要 new UserService() 才能修复语法错误。但是您仍然会遇到运行时错误。

这里的这段代码有问题:

class UserService {
    private userController: UserController;

    constructor(userController?: UserController) {
        this.userController = userController;
    }

private userController: UserController 表示 this.userController 必须始终是 UserController。但是 constructor(userController?: UserController) 意味着您可以使用 UserController 或不使用 UserController 来构造它。如果您不带参数调用 new UserService(),那么 this.userController 就是 undefined,这是不对的。如果 this.userControllerundefined.

,那么这样做 await this.userController.registration(req.body) 会给你错误

为了让您的 UserService 工作,您 必须 向构造函数提供一个 UserController 参数。

我们更改 constructor 使其不再是可选的:

    constructor(userController: UserController) {

但是现在我们在您创建 AppRouter 的行中遇到问题,因为您需要提供 UserController.

这行不通:

export default new AppRouter(new UserService()).router;

我不确定您如何实例化 UserController(它需要任何参数吗?),所以这可能不正确。但它应该看起来像这样:

const userController = new UserController();

export default new AppRouter(new UserService(userController)).router;