【问题标题】:Cannot read properties of undefined when using inversifyJS inject使用 inversifyJS 注入时无法读取未定义的属性
【发布时间】:2023-02-16 21:23:17
【问题描述】:

我使用 express 和 typescript 开始了一个新项目,我正在尝试使用 inversifyJS 设置 DI 容器。 它应该是非常简单的用例,只有 1 个路由和控制器 到目前为止我的文件:

控制器\项目\项目.控制器

import { inject, injectable } from "inversify";

import "reflect-metadata";
import { IProjectService } from "../../services/projects/interface/IProjectService";
import { TYPES } from "../../services/projects/types";

@injectable()
class ProjectController {
  private _processService: IProjectService;

  constructor(@inject(TYPES.IProjectService) projectServicee: IProjectService) {
    this._processService = projectServicee;
  }

  public getProjects(): string {
    return this._processService.getProject();
  }
}

export { ProjectController };

服务\项目\imp\ProjectService.ts

import { injectable } from "inversify";
import "reflect-metadata";
import { IProjectService } from "../interface/IProjectService";

@injectable()
class ProjectServicee implements IProjectService {
  getProject(): string {
    return "Project A";
  }
}

@injectable()
class ProjectService implements IProjectService {
  getProject(): string {
    return "Project B";
  }
}

export { ProjectServicee, ProjectService };

服务\项目\接口\IProjectService.ts

export interface IProjectService {
  getProject(): string;
}

路线\项目.ts在这里,我向容器询问 ProjectController 的实例并按预期获取它,但是其中的 IProjectService 的私有实例在运行时未定义

import { myContainer } from "../../inversify.config";
import { ProjectController } from "../controllers/projects/projects.controller";
import { CONTROLLERS_TYPES } from "../controllers/types";

import * as express from "express";
const router = express.Router();

const pc = myContainer.get<ProjectController>(
  CONTROLLERS_TYPES.ProjectController
);

router.get("/", pc.getProjects);

export default router;

根\inversify.config.ts

import { Container } from "inversify";
import { TYPES } from "./src/services/projects/types";
import { IProjectService } from "./src/services/projects/interface/IProjectService";
import { ProjectService } from "./src/services/projects/imp/ProjectService";
import { CONTROLLERS_TYPES } from "./src/controllers/types";
import { ProjectController } from "./src/controllers/projects/projects.controller";
const myContainer = new Container();

myContainer
  .bind<ProjectController>(CONTROLLERS_TYPES.ProjectController)
  .to(ProjectController);
myContainer.bind<IProjectService>(TYPES.IProjectService).to(ProjectService);

export { myContainer };

控制器\类型.ts

const CONTROLLERS_TYPES = {
  ProjectController: Symbol.for("ProjectController"),
};

export { CONTROLLERS_TYPES };

服务\项目\types.ts

const TYPES = {
  IProjectService: Symbol.for("IProjectService"),
};

export { TYPES };

最后是我的主要内容:

import projectRoutes from "./routes/projects";

import express from "express";
const app = express();

app.get("/", function (req, res) {
  res.send("Hello World");
});

app.use("/api/projects", projectRoutes);

console.log("Listening on port 3000");
app.listen(3000);

现在,当尝试调用控制器的 get 方法时,出现错误:Cannot read properties of undefined (reading '_processService')

这意味着控制器中 _processService 的初始化没有工作,我错过了什么?

【问题讨论】:

  • 根据 inversifyJS documentationreflect-metadata 应该由消费者在整个应用程序中只导入一次。在你的情况下,我会说是routes\projects.ts。您正在将其导入所有 @injectable 类。但是,IDK 如果这是您问题的原因。

标签: typescript dependency-injection inversifyjs


【解决方案1】:

我不知道你是否已经解决了它,我也遇到了这个问题。实际上我代码中的所有实现都没有问题。

我认为当您在 router.get() 方法中传递 pc.getProjects 时,您将失去“this”引用。

也许尝试做:

router.get("/", pc.getProjects.bind(pc));

代替:

router.get("/", pc.getProjects);

这对我有用。让我知道事情的后续...

【讨论】:

    猜你喜欢
    • 2016-10-05
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多