Creo una clase AuthRouter:
import { Router } from 'express' import Container, { Service } from 'typedi' import AuthenticationController from './index' @Service() class AuthenticationRouter { constructor (private readonly authenticationController: AuthenticationController) {} getRouter () { const router = Router() router.get('/auth/url', this.authenticationController.getAuthUrl) return router } } const authRouter = Container.get(AuthenticationRouter) const routes = authRouter.getRouter() export default routesAuthController.ts:
import { Request, Response } from 'express' import { Service } from 'typedi' import AuthenticationService from './authentication-service' @Service() class AuthenticationController { constructor (private readonly authService: AuthenticationService) {} async getAuthUrl (req: Request<{}, {}, {}, {redirect: string}>, res: Response) { return res.redirect(this.authService.generateAuthenticationUrl(req.query.redirect)) } } export default AuthenticationControllerServicio de autenticación:
import { OAuth2Client } from 'google-auth-library' import { google, oauth2_v2 } from 'googleapis' import { Service } from 'typedi' @Service() class AuthenticationService { private oauth2Client: OAuth2Client; private auth: oauth2_v2.Oauth2 constructor () { this.oauth2Client = new google.auth.OAuth2({ clientId: process.env.CLIENT_ID, clientSecret: process.env.CLIENT_SECRET, redirectUri: process.env.REDIRECT_URI }) this.auth = google.oauth2({ version: 'v2', auth: this.oauth2Client }) } generateAuthenticationUrl (redirect: string) { const url = this.oauth2Client.generateAuthUrl({ scope: ['email', 'profile'], access_type: 'offline', state: redirect || '/' }) return url } } export default AuthenticationService;Cuando ejecuto el servidor, me sale este error:
(node:4470) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'authService' of undefinedDeclaré el contenedor para el enrutador de autenticación, pero creo que el AuthController no está inyectado. ¿Cómo puedo arreglar eso?
Actualicé el método getRouter para solucionar el problema:
getRouter () { const router = Router() router.get('/google/url', (req: Request<{}, {}, {}, {redirect: string}>, res) => this.authenticationController.getAuthUrl(req, res)) return router }