【问题标题】:implement express controller class with typescript用打字稿实现快速控制器类
【发布时间】:2017-02-22 10:16:55
【问题描述】:

我正在用打字稿做一个快速应用程序。 路由器代码是:

let user = new User();
router.get("/", user.test);

用户类是

export class User {
   test(req, res, next) {
      // this === undefined
   }
}

问题在于 this 对象在测试方法中未定义。有没有更好的方式来实现快速路由?

【问题讨论】:

标签: node.js express typescript routing


【解决方案1】:

调用方法时需要使用bind function来保持this的作用域:

let user = new User();
router.get("/", user.test.bind(user));

或者您可以在User 构造函数中这样做:

export class User {
    constructor() {
        this.test = this.test.bind(this);
    }

    test(req, res, next) {
        ...
    }
}

另一种选择是使用arrow function

let user = new User();
router.get("/", (req, res, next) => user.test(req, res, next));

【讨论】:

  • 函数结束时类会从内存中移除的内存会怎样...?
  • @usama 我不确定你的意思。类不会被删除,实例可能会被删除,这取决于是否有人引用它。你指的是哪个函数?
  • 我指的是我想使用带有 express.js 路由的类而不是函数的实例。
  • @usama 您是在询问是否会在函数处理请求后从内存中删除实例(如果您将其放入路由器中)?如果是这样,那么答案是否定的。您传递了对绑定到特定实例的方法的引用,因此该实例有一个引用,这将阻止 GC 从内存中清除它。
  • 是的,你是对的,我在问这个问题。感谢您解释它,如果我将类的静态方法用于路由器方法,那么内存呢?这是处理它的好方法......?
【解决方案2】:

您可以使用export default 并实例化控制器,以便在您导入控制器的任何文件中无需实例化即可使用它。

register.controller.ts

import { Router, Request, Response, NextFunction } from 'express';

class Register {

    constructor() {    
      this.register = this.register.bind(this);
    }

    register(req: Request, res: Response, next: NextFunction) {
      // ... removed for brevity
    }
}

export default new Register();

server.ts 或 auth.routes.ts

import registerCtrl from '../controllers/auth/register.controller.js';

// ... removed for brevity

router.post('/register', registerCtrl.register);

【讨论】:

    猜你喜欢
    • 2019-05-31
    • 1970-01-01
    • 2020-10-25
    • 2021-03-20
    • 2020-03-24
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 2019-03-26
    相关资源
    最近更新 更多