使用 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.userController
是 undefined
.
,那么这样做 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;
我们如何在路由文件中使用依赖注入的概念并在服务器文件中添加?
我尝试在我的节点项目中使用依赖注入,但我认为我走的路不对。我正在尝试将我的 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.userController
是 undefined
.
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;