如何使用 Serverless Framework 管理 Lambda 内 Aurora Serverless 数据 api 的 typeORM 连接

Mat*_*hyn 7 aws-lambda serverless-framework typeorm aws-aurora-serverless

我在用着:

我正在连接到数据库,就像 github 中描述的那样,

const connection = await createConnection({
      type: 'aurora-data-api-pg',
      database: 'test-db',
      secretArn: 'arn:aws:secretsmanager:eu-west-1:537011205135:secret:xxxxxx/xxxxxx/xxxxxx',
      resourceArn: 'arn:aws:rds:eu-west-1:xxxxx:xxxxxx:xxxxxx',
      region: 'eu-west-1'
    })
Run Code Online (Sandbox Code Playgroud)

这就是我在 Lambda 函数中使用它的方式

export const testConfiguration: APIGatewayProxyHandler = async (event, _context) => {
  let response;
  try {
    const connectionOptions: ConnectionOptions = await getConnectionOptions();
    const connection = await createConnection({
      ...connectionOptions,
      entities,
    });
    const userRepository = connection.getRepository(User);
    const users = await userRepository.find();

    response = {
      statusCode: 200,
      body: JSON.stringify({ users }),
    };
  } catch (e) {
    response = {
      statusCode: 500,
      body: JSON.stringify({ error: 'server side error' }),
    };
  }
  return response;
};
Run Code Online (Sandbox Code Playgroud)

当我第一次执行时,效果很好。

但第二次和下一次我收到错误

AlreadyHasActiveConnectionError: Cannot create a new connection named "default", because connection with such name already exist and it now has an active connection session.
Run Code Online (Sandbox Code Playgroud)

那么,管理此连接的正确方法是什么?是否应该以某种方式重用它?

我找到了一些简单 RDS 的解决方案,但 Aurora Serverless Data API的重点是您不必管理连接

mlg*_*g87 8

当您尝试建立连接时,您需要检查是否已经存在可以使用的连接。这是我Database用来处理连接的类

export default class Database {
  private connectionManager: ConnectionManager;

  constructor() {
    this.connectionManager = getConnectionManager();
  }

  async getConnection(): Promise<Connection> {
    const CONNECTION_NAME = 'default';

    let connection: Connection;

    if (this.connectionManager.has(CONNECTION_NAME)) {
      logMessage(`Database.getConnection()-using existing connection::: ${CONNECTION_NAME}`);
      connection = await this.connectionManager.get(CONNECTION_NAME);

      if (!connection.isConnected) {
        connection = await connection.connect();
      }
    } else {
      logMessage('Database.getConnection()-creating connection ...');
      logMessage(`DB host::: ${process.env.DB_HOST}`);

      const connectionOptions: ConnectionOptions = {
        name: CONNECTION_NAME,
        type: 'postgres',
        port: 5432,
        logger: 'advanced-console',
        logging: ['error'],
        host: process.env.DB_HOST,
        username: process.env.DB_USERNAME,
        database: process.env.DB_DATABASE,
        password: process.env.DB_PASSWORD,
        namingStrategy: new SnakeNamingStrategy(),
        entities: Object.keys(entities).map((module) => entities[module]),
      };

      connection = await createConnection(connectionOptions);
    }

    return connection;
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 随着 ConnectionManager 的弃用,是否有更新的解决方案?https://github.com/typeorm/typeorm/issues/8010 (2认同)