Я довольно новичок в NodeJS, но я хотел бы узнать что-то новое. Я пришел из необычного внедрения зависимостей .NET, инверсии управления, блестящего мира микросервисов, поэтому я пытаюсь написать какой-то сервис на TypeScript, основываясь на моем предыдущем опыте.
Я использую экспресс и маршрутизатор экспресс для создания API. У меня есть некоторые методы в маршрутизаторе, который обрабатывает вызовы API, и я хочу использовать какой-то объект службы для извлечения и обработки данных.
Я внедряю сервис в маршрутизатор с помощью инжектора конструктора, но если я хочу использовать свой сервис, он выдает ошибку:
TypeError: Невозможно прочитать свойство layoutService с неопределенным значением
Я понял, что методы были вызваны без контекста, поэтому я добавил .bind(this)
к каждой регистрации метода, и она работает, но я не знаю, является ли это лучшим способом, как это сделать.
У кого-нибудь есть идея получше?
упрощенный сервер.ts
import express, { Router } from "express";
// inversion of controll
import container from "./ioc";
import { TYPE } from "./constants";
import IMyService from "./abstract/IMyService";
// import routers
import MyRouter from "./api/MyRouter";
app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
const router: Router = express.Router();
const myRouter: MyRouter = new MyRouter(container.get<IMyService>(TYPE.IMyService));
app.use("/", router);
app.use("/api/v1/layouts", layoutRouter.router);
MyRouter.ts
import IMyService from "./abstract/IMyService";
import { Router, Request, Response } from "express";
import { inject } from "inversify";
import { TYPE } from "../constants";
export default class MyRouter {
public readonly router: Router;
private readonly myService: IMyService;
constructor(
@inject(TYPE.IMyService) myService: IMyService
) {
this.myService = myService;
this.router = Router();
this.routes();
}
public GetAll(req: Request, res: Response): void {
this.myService.getAll()
.then(data => {
const status: number = res.statusCode;
res.json({ status, data });
})
.catch(err => {
const status: number = res.statusCode;
res.json({ status, err });
});
}
public GetOne(req: Request, res: Response): void {
const id: string = req.params.id;
this.myService.getOne(new ObjectID(id))
.then(data => {
const status: number = res.statusCode;
res.json({ status, data });
})
.catch(err => {
const status: number = res.statusCode;
res.json({ status, err });
});
}
routes(): void {
this.router
.get("/", this.GetAll)
.get("/:id", this.GetOne);
}
}