【问题标题】:Can't use method from a controller class无法使用控制器类中的方法
【发布时间】:2021-08-16 06:03:49
【问题描述】:

我正在尝试构建我的 Express.js 代码,但是在尝试使用控制器中的类方法时遇到了问题。

这是它的样子:

product.service.ts

export class ProductService {
  constructor(private readonly model: Model<ProductType>) {}

  public getAllProducts = () => {
    return this.model.find({});
  };
}

product.controller.ts

export class ProductController {
  constructor(private readonly service: ProductService) {}

  public getProducts = async (req: Request, res: Response) => {
    const response: ProductType[] = await this.service.getAllProducts();
    res.send(response);
  };
}

products.router.ts

import express, { Router } from 'express';
import { ProductController } from '../controllers/product.controller';

const router: Router = express.Router();

router.get('/', ProductController.getProducts);

问题出在我的 products.router.ts 中,它一直在说

类型“typeof ProductController”.ts(2339) 上不存在属性“getProducts”

谁能告诉我我做错了什么?

【问题讨论】:

  • 您永远不会实例化您的控制器,也永远不会将其传递给服务。 getProducts 不是静态方法。如果您想这样使用它,请使用单例对象文字而不是 class

标签: javascript node.js typescript express model-view-controller


【解决方案1】:

一种可能性:

import express, { Router } from 'express';
import { ProductController } from '../controllers/product.controller';

const router: Router = express.Router();

const productModel = /* however you create Model<ProductType> */;
const productService = new ProductService(productModel);
const productController = new ProductController(productService);

router.get('/', productController.getProducts);

【讨论】:

  • 为了让this 指向您的getProducts 函数中的ProductController 对象,您实际上可能想要:router.get('/', productController.getProducts.bind(productController));
【解决方案2】:

我认为你应该创建一个此类的实例以便能够访问它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 2021-05-22
    • 2013-01-25
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多