[英]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
來構造它。 如果你在沒有 arguments 的情況下調用new UserService()
,那么this.userController
是undefined
的,這是不行的。 如果this.userController
是undefined
,執行這樣的操作await this.userController.registration(req.body)
會給你錯誤。
為了讓您的UserService
工作,您必須向構造函數提供一個UserController
參數。
我們更改constructor
,使其不再是可選的:
constructor(userController: UserController) {
但是現在我們在創建AppRouter
的那一行遇到了問題,因為您需要提供一個UserController
。
這不起作用:
export default new AppRouter(new UserService()).router;
我不確定您如何實例化UserController
(它是否需要任何 arguments?),所以這可能不對。 但它應該看起來像這樣:
const userController = new UserController();
export default new AppRouter(new UserService(userController)).router;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.