如何在typeorm中正确使用和导出数据源

Hei*_*erg 7 orm typescript typeorm

当我参考此文档尝试连接数据库时,我使用 typeorm 开发了我的应用程序。

我尝试了以下示例,它返回了结果。

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

Run Code Online (Sandbox Code Playgroud)

但以下没有返回结果。

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

我想datasource在任何地方使用,所以我想知道如何导出和使用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)
Run Code Online (Sandbox Code Playgroud)

如果有人在exporting datasource全球范围内体验并使用它们,请告诉我如何使用它们。谢谢!

小智 4

我认为你可以使用依赖注入方法,例如)typdi。该文档说您可以导出初始化的 dataSource 对象并在全局中使用它,如下所示。

## 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)
    
Run Code Online (Sandbox Code Playgroud)

它可以正常工作,但我建议使用 DI 方式编写代码。

# 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)
Run Code Online (Sandbox Code Playgroud)

我不知道你的 API 规范,所以错过了很多代码规则。但这个想法很明确,而且有一些优点。

  1. 您可以在全局范围内访问初始化的 dataSource 对象。
  2. 您可以管理何时初始化数据源。我目前正在制作一个无服务器应用程序。第二个好处与冷启动有关,因此如果您正在研究整体架构,则无需提醒它。

我不确定这个方法,但它适用于我的项目。希望你能得到你想要的!