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);
