2016-10-13 16 views
4

我正在使用打字稿執行快速應用程序。 路由器的代碼是:實現與打字稿的快遞控制器類

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

用戶類是

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

的問題是,該目的是測試方法內不確定的。有更好的方法來實現快速路由嗎?

+1

你可以嘗試使用一些庫,如[路由控制器( https://github.com/pleerock/routing-controllers) – pleerock

回答

11

您需要使用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)); 
1

您可以使用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);