aws-lambda - 如何使用无服务器框架在 Lambda 中管理 Aurora Serverless 数据 API 的 typeORM 连接

标签 aws-lambda serverless-framework typeorm aws-aurora-serverless

我正在使用:

  • Aurora 无服务器数据 API (Postgres)
  • 使用 typeorm-aurora-data-api-driver 键入ORM
  • AWS Lambda 与无服务器框架(TypeScript、WebPack)

  • 我正在连接到数据库,就像它在 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'
        })
    
    这就是我在 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;
    };
    
    当我第一次执行时,它工作得很好。
    但是第二次和下一次我得到一个错误
    AlreadyHasActiveConnectionError: Cannot create a new connection named "default", because connection with such name already exist and it now has an active connection session.
    
    那么,管理这种连接的正确方法是什么?
    是否应该以某种方式重复使用?
    我找到了一些简单 RDS 的解决方案,但 Aurora Serverless 的全部要点数据 API 是您不必管理连接

    最佳答案

    当您尝试建立连接时,您需要检查是否已经存在可以使用的连接。这是我的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;
      }
    }
    

    关于aws-lambda - 如何使用无服务器框架在 Lambda 中管理 Aurora Serverless 数据 API 的 typeORM 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62951047/

    相关文章:

    java - 部署 Java AWS Lambda 的最佳方式是什么?

    ubuntu - 无法让 phantomjs 在 aws lambda 上工作

    aws-api-gateway - 如何在不达到每个 API 授权者限制的情况下在模板之间共享授权者

    nestjs - SpyOn TypeORM 存储库更改单元测试 NestJS 的返回值

    javascript - 如何在 TS 和 TypeORM 中创建泛型函数?

    node.js - 了解 Lambda 来调用 API

    yaml - 无服务器部署返回存储桶已存在

    aws-lambda - 更新 Lambda 中的 UserPool 触发器在调用 lambda 时出错

    typeorm - 我如何将 TypeORM 与 Better-sqlite3 一起使用

    aws-lambda - AWS Fargate 与具有预配置并发的 Lambda