TypeORM全局创建连接

时间:2018-06-02 12:25:14

标签: node.js typescript typeorm

我在节点Js应用程序中使用typeorm和typescript。我试图找出为类中的所有函数使用单个DB连接的方法。例如,我有两个函数我的类,并希望对所有函数使用全局/单连接,而不是在每个函数中创建连接,如下所示:

export class SQLDBService implements IDatabaseService{
private readonly logger = getLogger("SQLDBService");
private connection:Connection;


  getConversation(conversationId: string): ConversationEntity {

    let conversationEntity = new ConversationEntity();
    createConnection(/*...*/).then(async connection => {
        let dbObj = await connection.getRepository(ConversationEntity).findOne({
            conversationId: Equal(conversationId)
        });
        if(dbObj)
            conversationEntity = dbObj;
    });
    return conversationEntity;
}

  pushWrapUp(conversationId: string, wrapUp: string): void {

    createConnection().then(async connection => {
        let conversationEntity = await connection.getRepository(ConversationEntity).findOne({
            conversationId: Equal(conversationId)
        });
        if(conversationEntity){
            conversationEntity.wrapUp = wrapUp;
            conversationEntity.endTime = new Date();
            await connection.manager.save(conversationEntity);
        }
    });
}}

有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:2)

上面的代码没有有效地使用async..await因为promises没有链接,导致错误处理不当和控制流程不正确。

正如the documentation所解释的那样,

  

TypeORM的Connection不会像看起来那样设置数据库连接,而是设置连接池。 < ...>一旦调用Connection的connect方法,就建立连接池设置。如果使用createConnection函数设置连接,则会自动调用connect方法。调用close时会断开连接(关闭池中的所有连接)。通常,您必须在应用程序引导程序中仅创建一次连接,并在完全使用数据库后关闭它。

应用程序初始化时,

createConnection应该只被调用一次。由于它是异步的,因此初始化例程应该在使用TypeORM模型之前等待它。

正如文档所示,可以使用getConnection()代替createConnection。由于目的是获取默认连接的存储库,因此可以使用getRepository代替:

这是:

import {getRepository} from "typeorm";

  ...
  async getConversation(conversationId: string): ConversationEntity {
    let conversationEntity = new ConversationEntity();
    let dbObj = getRepository(ConversationEntity).findOne({
      conversationId: Equal(conversationId)
    });
    if(dbObj) conversationEntity = dbObj;
    return conversationEntity;
  }

答案 1 :(得分:0)

这种相当少的重构应该可以解决问题

export class SQLDBService implements IDatabaseService {
    private readonly logger = getLogger("SQLDBService");
    private connection:Connection;

    init() {
        this.connection = await createConnection(/*...*/)
    }
    getConversation(conversationId: string): ConversationEntity {

        let conversationEntity = new ConversationEntity();
        let dbObj = await this.connection.getRepository(ConversationEntity).findOne({
            conversationId: Equal(conversationId)
        });
        if(dbObj)
            conversationEntity = dbObj;
        return conversationEntity;
    }

    pushWrapUp(conversationId: string, wrapUp: string): void {

        let conversationEntity = await this.connection.getRepository(ConversationEntity).findOne({
            conversationId: Equal(conversationId)
        });
        if(conversationEntity){
            conversationEntity.wrapUp = wrapUp;
            conversationEntity.endTime = new Date();
            await this.connection.manager.save(conversationEntity);
        }
    }
}

const db = new SQLDBService()
try {
   await db.init()
}
catch (error) {
 console.error("db connection error")
 console.error(error)
 console.error("db connection error")
}

答案 2 :(得分:-1)

您应该使用全局连接池,它将为您创建,保留和处理已使用的连接。我不熟悉node.js,所以我不能给出这种第三方库的名称。但必须有一些,因为连接池是一种被广泛接受的设计模式。