How to use and export datasource correctly in typeorm

Viewed 388

I developed my apps by using typeorm when I try to connect DB by refering to this document.

I tried following samples and it returned result.

  const datasource = new DataSource(LocalOrmconfig)

  datasource.initialize()
  .then(() => {
    console.log("Data Source has been initialized!");
    const result = datasource.getrepository(Sample).findone(query)
  })
  .catch((err) => {
    console.error("Error during Data Source initialization", err);
  });

But following is not returned result.

document says It's a good idea to make AppDataSource globally available by export-ing it, since you'll use this instance across your application.

I would like to use datasource everywhere so I'd like to know how to export and use datasource.

  const datasource = new DataSource(LocalOrmconfig)

  datasource.initialize()
  .then(() => {
    console.log("Data Source has been initialized!");
  })
  .catch((err) => {
    console.error("Error during Data Source initialization", err);
  });


 const result = await datasource.getrepository(Sample).findone(query)

If someone experienced exporting datasource and use them globally ,will you please let me know how to use them. Thanks!

1 Answers

I think you can use the dependency injection method, e.g) typdi. The documentation says you can export initialized dataSource object and use it in global like this.

## connection.js ##
const connToDS = async() => {
    const dataSourceConn = new DataSource(LocalOrmconfig);
    try{
        await dataSourceConn.initialize();
        console.log("Data Source has been initialized!");
        return dataSourceConn;
    }catch(err){
        console.error("Error during Data Source initialization", err);        
    }
}

export const dataSource = connToDS();


## service.js ##
import {dataSource} from './Connection';

let serviceDS = await dataSource;
const result = await serviceDS.getrepository(Sample).findone(query)
    

It could work properly, but I recommend writing code in DI way.

# write connection.js as above
## server.js
import Container from 'typedi';
import {dataSource} from './Connection';
import {DataSource} from 'typeorm';

let globalDS;
# at start point of your application
if(!globalDS){
    globalDS = await dataSource;
    Container.set(DataSource,globalDS);
}

## service.js ##
import Container from 'typedi';
import {DataSource} from 'typeorm';

let dataSource = Container.get(DataSource)
const result = await dataSource.getrepository(Sample).findone(query)

I don't know your API specs, So missed many code rules. But the idea is clear, and there are a few pros.

  1. You can access initialized dataSource object on a global scope.
  2. You can manage when to initialize dataSource. I currently making a serverless application. The second benefit is related to cold start, so if you working on monolithic architecture then you don't have to remind it.

I'm not sure about this method but it works on my project. Hope you get what you want!

Related