0

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

从命令提示符节点向上迁移完成后,它可以正常工作。我正在使用 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;
}
4

0 回答 0