【问题标题】:Dependency Injection with typescript and express using classes使用打字稿进行依赖注入并使用类进行表达
【发布时间】:2021-05-22 16:41:15
【问题描述】:

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

我尝试在我的节点项目中使用依赖注入,但我认为我没有走在正确的道路上。我正在尝试将我的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;

用户服务类

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);
      });
  }
}

【问题讨论】:

  • 有谁能帮帮我吗?

标签: node.js typescript express dependency-injection


【解决方案1】:

您已经设计了其中一些类以在其构造函数中获取依赖项,但您需要确保在调用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 或不使用@ 构造它。如果您在没有参数的情况下调用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;

【讨论】:

  • 感谢您的帮助,我在再次运行后也解决了这个问题,实际上通过使用 new,我们必须传递构造函数中使用的每个对象实例。所以为了避免这种情况,我在节点 js 中使用了 typedi 和容器的概念
猜你喜欢
  • 2015-09-26
  • 2014-01-19
  • 2014-03-25
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多