node.js - implementera express-kontrollerklass med typescript


Jag gör en express-app med TypeScript. Routernkoden är:

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

användarklassen är

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

problemet är att detta objekt är odefinierat inuti testmetoden. Finns det ett bättre sätt att implementera express-routing?

Svar #1

Du behöver använda bind-funktionen för att behålla omfattningen av this när metoden anropas:

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

Eller så kan du göra det i User-konstruktorn:

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

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

Ett annat alternativ är att använda en pilfunktion:

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

Svar #2

Du kan använda export default och instansiera kontrollern så att den kan användas utan instansiering i vilken fil du än har importerat kontrollern.

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

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

// ... removed for brevity

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

Relaterade artiklar