TypeError: Cannot read property 'authService' of undefined with TypeDi


I create a class AuthRouter:

import { Router } from 'express'
import Container, { Service } from 'typedi'
import AuthenticationController from './index'

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 routes


import { Request, Response } from 'express'
import { Service } from 'typedi'
import AuthenticationService from './authentication-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 AuthenticationController


import { OAuth2Client } from 'google-auth-library'
import { google, oauth2_v2 } from 'googleapis'
import { Service } from 'typedi'

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;

When I run the server, I got this error:

(node:4470) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'authService' of undefined

I declared the container for the authenticationRouter but I think the AuthController is not injected.
How can I fix that?


I updatedt the getRouter method to fix the issue:

getRouter () {
    const router = Router()
    router.get('/google/url', (req: Request<{}, {}, {}, {redirect: string}>, res) => this.authenticationController.getAuthUrl(req, res))

    return router

Answered By – Slim

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published