带有 Aws Lambda 功能的 Umzug Migration UP 不起作用

Umzug Migration UP with Aws Lambda function not working

我已经使用 nestjs + Sequelize ORM + docker 数据库(截至目前本地)构建了一个测试应用程序。根据文档,我正在使用 umzug 库和 AWS Lambda SAM 模板并触发 lambda 处理程序。下面是它的代码。实现连接池以重用现有的续集连接。下面是我触发 umzug.up() 函数的 lambdaEntry.ts 文件。它正在触发但不迁移文件。

从命令提示符 node migrate up 完成后,它工作正常。我正在使用 sam invoke 命令进行测试。

  require('ts-node/register');
  import { Server } from 'http';
  import { NestFactory } from '@nestjs/core';
  import { Context } from 'aws-lambda';
  import * as serverlessExpress from 'aws-serverless-express';
  import * as express from 'express';
  import { ExpressAdapter } from '@nestjs/platform-express';
  import { eventContext } from 'aws-serverless-express/middleware';
  import { AppModule } from './app.module';
  import sharedBootstrap from './sharedBootstrap';
  const { Sequelize } = require('sequelize');
  const { Umzug, SequelizeStorage } = require('umzug');
  import configuration from '.././config/config';
  const fs = require('fs');

  let lambdaProxy: Server;
  let sequelize = null;

  async function bootstrap() {
   const expressServer = express();
   const nestApp = await NestFactory.create(
                   AppModule,
                   new ExpressAdapter(expressServer),
                  );
    nestApp.use(eventContext());
    sharedBootstrap(nestApp);
    await nestApp.init();
    return serverlessExpress.createServer(expressServer);
   }
   export const handler = (event: any, context: Context) => {
    if (!lambdaProxy) {
       bootstrap().then((server) => {
       lambdaProxy = server;
       serverlessExpress.proxy(lambdaProxy, event, context);
       (async () => {
        if (!sequelize) {
          console.log('New connection::');
           sequelize = await loadSequelize();
        } else {
           sequelize.connectionManager.initPools();
           if (sequelize.connectionManager.hasOwnProperty('getConnection')) {
             delete sequelize.connectionManager.getConnection;
           }
         }

         try {
        console.log('MIGRATOR::');
        const umzug = new Umzug({
          migrations: { glob: 'src/migrations/*.ts' },
          context: sequelize.getQueryInterface(),
          storage: new SequelizeStorage({ sequelize }),
          logger: console,
        });
        await umzug
          .pending()
          .then((migrations: any) => {
            console.log('pending ?  : ', JSON.stringify(migrations));

            //test for file exists.
            for (const migration of migrations) {
              try {
                if (fs.existsSync(migration.path)) {
                  console.log('file exists');
                }
              } catch (err) {
                console.log('file does not exists');
                console.error(err);
              }
            }
            async () => {
              //BELOW FUNCTION IS TRIGGERING BUT NOT GETTING MIGRATION LOADED.
              await umzug.up();
            };
          })
          .catch((e: any) => console.log('error2 ? ', e));
      } finally {
        await sequelize.connectionManager.close();
      }
    })();
  });
  } else {
  serverlessExpress.proxy(lambdaProxy, event, context);
 }
};

async function loadSequelize() {
 const sequelize = new Sequelize(
  configuration.database,
  configuration.username,
  configuration.password,
  {
    dialect: 'mysql',
    host: configuration.host,
    port: Number(configuration.port),
    pool: {
      max: 2,
      min: 0,
      idle: 0,
      acquire: 3000,
      evict: 600,
     },
   },
 );
 await sequelize.authenticate();
 return sequelize;
}

经过多次尝试,我能够解决问题。我分离出 sequelize 连接代码并从应用端调用它并从 lambdaentry

触发

lambdaEntry.js 文件.

async function bootstrap(uuid = null) {
  console.log('Calling bootstrap');
  const expressServer = express();
  const nestApp = await NestFactory.create(
    AppModule,
    new ExpressAdapter(expressServer),
  );
  nestApp.use(eventContext());
  sharedBootstrap(nestApp);
  await nestApp.init();

  try {
    // Write a function in Service (ex: purhaslistservice) and trigger the service with umzug up from here.
    const migrateResult1 =  await nestApp.get(PurchaseListService).migrate('down');
    console.log(migrateResult1);
    const migrateResult2 =  await nestApp.get(PurchaseListService).migrate('up');
    console.log(migrateResult2);
  } catch (err) {
    throw err;
  }
  return serverlessExpress.createServer(expressServer);
}

export const handler = (event: any, context: Context) => {
   if (!lambdaProxy) {
    bootstrap(uuid).then((server) => {
      lambdaProxy = server;
      serverlessExpress.proxy(lambdaProxy, event, context);
    });
  } else {
    serverlessExpress.proxy(lambdaProxy, event, context);
  }
};

/code/src/purchaselist/purchaselist.service.ts

async migrate(id: string): Promise<any> {
    console.log('migrate script triggered', id);
    const sequelize = PurchaseListItem.sequelize;
    const umzug = new Umzug({
      migrations: { glob: 'src/migrations/*.{ts,js}' },
      context: sequelize.getQueryInterface(),
      storage: new SequelizeStorage({ sequelize }),
      logger: console,
    });
    let consoleDisplay = 'Umzug LOGS:::<br/>';
    switch (id) {
      default:
      case 'up':
        await umzug.up().then(function (migrations) {
          console.log('Umzug Migrations UP::<br/>', migrations);
          consoleDisplay +=
            'Umzug Migrations UP::<br/>' + JSON.stringify(migrations);
        });
        break;
    }
    return consoleDisplay;
  }