Мне нужна помощь в преобразовании приложения Serverless Nest js в обычное приложение Express - PullRequest
0 голосов
/ 13 июля 2020

У меня есть сервер, который был построен с нуля с использованием Serverless и Nest js, но мы хотим переместить его в ecs / ec2, потому что он должен работать круглосуточно и без выходных. Можно ли извлечь бессерверную версию или мне лучше переписать загрузочную часть приложения?

index.ts с функцией обработчика используется при развертывании sls, в то время как main.ts используется для разработки .

пакет. json:

"scripts": {
    "format": "prettier --write \"**/*.ts\"",
    "start": "ts-node -r tsconfig-paths/register src/main.ts",
    "start:dev": "nodemon",
    "prestart:prod": "rm -rf dist && tsc",
    "start:prod": "rm -rf dist && tsc && node dist/main.js",
    "start:hmr": "node dist/server",
    "webpack": "webpack --config webpack.config.js",
    "local-server": "rm -rf dist && tsc && export AWS_REGION=us-east-1 && export IS_ON_LOCAL_SERVER=true && export TZ=UTC && sls offline start --stage dev",
    "local-prod-server": "rm -rf dist && tsc && export AWS_REGION=us-east-1 && export IS_ON_LOCAL_SERVER=true && export TZ=UTC && sls offline start --stage prod",
    "deploy:prod": "rm -rf dist && tsc && sls deploy --stage prod",
    "deploy:dev": "rm -rf dist && tsc && sls deploy --stage dev"
  },

Вот мой index.ts:

import * as serverless from 'aws-serverless-express';
import * as bunyan from 'bunyan';
import * as audit from 'express-requests-logger';
import { Server } from 'http';

import { NestFactory } from '@nestjs/core';
import * as bodyParser from 'body-parser';

import { AppModule } from './app.module';
import { FasLoggerService } from './fas-logger.service';

// tslint:disable-next-line:no-var-requires
const express = require('express')();
let cachedServer: Server;
export const logger: any = bunyan.createLogger({
  name: 'app',
  stream: process.stdout,
  level: 'debug',
  serializers: {}
});

function bootstrapServer(): Promise<Server> {
  return NestFactory.create(AppModule, express, {
    logger: new FasLoggerService()
  })
    .then(app => {
      app.useLogger(app.get(FasLoggerService));
      app.enableCors({
        allowedHeaders: ['Content-Type', 'Authorization'],
        origin: '*',
        methods: ['POST', 'GET', 'PUT', 'DELETE', 'HEAD', 'PATCH'],
        preflightContinue: false,
        optionsSuccessStatus: 204
      });
      app.use(bodyParser.json({limit: '50mb'}));
      app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));
      app.use(
        audit({
          logger,
          excludeURLs: [],
          doubleAudit: false,
          request: {
            excludeHeaders: ['authorization'],
            excludeBody: ['*']
          },
          response: {
            excludeBody: ['*']
          }
        })
      );
      return app;
    })
    .then(app => app.init())
    .then(() => serverless.createServer(express));
}

export const handler: any = (event: any, context: any) => {
  if (!cachedServer) {
    bootstrapServer().then(server => {
      cachedServer = server;
      return serverless.proxy(server, event, context);
    });
  } else {
    return serverless.proxy(cachedServer, event, context);
  }
};

Вот мой main.ts:

import * as bunyan from 'bunyan';
import * as audit from 'express-requests-logger';

import { NestFactory } from '@nestjs/core';
import * as bodyParser from 'body-parser';

import { AppModule } from './app.module';
import { FasLoggerService } from './fas-logger.service';

export const logger: any = bunyan.createLogger({
  name: 'app',
  stream: process.stdout,
  level: 'debug',
  serializers: {}
});

async function bootstrap() {
  const app = await NestFactory.create(AppModule, {
    logger: new FasLoggerService()
  });
  app.useLogger(app.get(FasLoggerService));
  app.use(bodyParser.json({ limit: '50mb' }));
  app.use(bodyParser.urlencoded({ limit: '50mb', extended: true }));
  app.enableCors({
    allowedHeaders: ['Content-Type', 'Authorization'],
    origin: '*',
    methods: ['POST', 'GET', 'PUT', 'DELETE', 'HEAD', 'PATCH'],
    preflightContinue: false,
    optionsSuccessStatus: 204
  });

  app.use(
    audit({
      logger,
      excludeURLs: [],
      doubleAudit: false,
      request: {
        excludeHeaders: ['authorization'],
        excludeBody: ['*']
      },
      response: {
        excludeBody: ['*']
      }
    })
  );
  await app.listen(3000);
}
bootstrap();
...