Search code examples
node.jstypescripttypeormexpress-router

TypeORM Connection "default" was not found when using a routes file and repository pattern


I have a TS project where I'm using TypeORM. I'm using Repository pattern so I have layers: Controller -> Service -> Repository.

The Controller constructor initialize the Service class which initialize Repository class, where the constructor is:

constructor(){
    this.ormRepository = getRepository(TypeormEntity)
}

This works fine when I create the routes in the index.ts like this:

createConnection().then(() => {
  const controller = new MyController()
  app.get('/', controller.getSomething);
})

The connection is created and then I initialize the class using new MyController().

The problem is when I want to get the routes in another file. I want to get this structure folder:

src
 |--> index.ts
 |--> routes 
      |--> v1
           |--> router.ts
           |--> value
                 |--> value.route.ts
      |--> v2
           |--> ...

So, to achieve this, the index.ts import the routes. But the problem is, as the import is done, the MyController() constructor is executed and the execution fails.

So I want to have something like this in index.ts

import * as express from 'express'
import { createConnection } from "typeorm";
import Router from './routes/v1/router'

const app = express()
createConnection().then(() => {
  app.use('/', Router)
  app.listen(port)
})

Also, following the import call, the file router.ts in routes/v1 is:

import { json, Router } from 'express'
import valueRouter from './value/value.route'

const router = Router()
router.use(json())
router.use('/value', valueRouter)

export default router

This is to add a "prefix" to all routes depending the resource they call.

And value.route.ts is where the controller is initialized and fails.

import { Router } from "express";
import ValueController from '../../../controller/value.controller'

const router = Router()
const vc = new ValueController()
router.get('/',vc.getSomething)

export default router

I've tested deleting the constructor and the project intializes ok, so the problem is the repository initialization accross Controller & Service.

How can I achieve this?

Thanks in advance.


Solution

  • Finally I solved my own issue using dynamic imports.

    Now my index.ts looks like this:

    createConnection().then(() => {
      import('./routes/v1/router').then((router: any) => {
        app.use('/', router.default)
        app.listen(port)
      })
    })
    

    Which I think is much cleaner than having all routes added in this file. Calling routes in an external file I can manage a huge amount and maintain a clean structure.