Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

implement express controller class with typescript

I'm doing an express app with typescript. The router code is:

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

the user class is

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

the problem is that the this object is undefined inside test method. Is there a better way to implement express routing?

like image 664
phzonta Avatar asked Oct 13 '16 10:10

phzonta


2 Answers

You need to use the bind function to keep the scope of this when the method is invoked:

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

Or you can do that in the User constructor:

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

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

Another option is to use an arrow function:

let user = new User();
router.get("/", (req, res, next) => user.test(req, res, next));
like image 83
Nitzan Tomer Avatar answered Nov 09 '22 19:11

Nitzan Tomer


You can use export default and instantiate the controller so it can be used without instantiation in whichever file you've imported the controller.

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 or auth.routes.ts

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

// ... removed for brevity

router.post('/register', registerCtrl.register);
like image 39
mtpultz Avatar answered Nov 09 '22 17:11

mtpultz