首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Typeorm和Express.js的无服务器Typescript Rest API

使用Typeorm和Express.js的无服务器Typescript Rest API
EN

Stack Overflow用户
提问于 2020-12-28 02:38:24
回答 1查看 1.2K关注 0票数 0

我是Node.js的新手。目前,我在Heroku上有一个基于微服务架构的工作系统,我的目标是将我们的基础设施改为AWS Lambda,使用带有Typescript的Serverless,同时也从Sequelize切换到TypeORM,并继续使用express.js作为Restful API框架。

我试图让所有这些东西一起工作,最终在对我的服务运行基本的GET请求时(使用sls脱机运行),我收到了Cannot Get /documents

我确信问题出在app.ts。路由是空的,但我不知道如何修复它。

我已经尝试了许多其他选项,但这个选项似乎与数据库一起工作得很好,它甚至自动迁移了我的实体并在我的数据库中正确地创建了表。

任何提示或指导都将不胜感激。

我的代码:

代码语言:javascript
复制
//serverless.ts

import type { Serverless } from 'serverless/aws';

const serverlessConfiguration: Serverless = {
  service: {
    name: 'iod-typeorm-test',
    // app and org for use with dashboard.serverless.com
    // app: your-app-name,
    // org: your-org-name,
  },
  frameworkVersion: '2',
  custom: {
    webpack: {
      webpackConfig: './webpack.config.js',
      includeModules: true
    }
  },
  // Add the serverless-webpack plugin
  plugins: ['serverless-webpack','serverless-offline'],
  provider: {
    name: 'aws',
    profile: '01iod',
    region: 'eu-central-1',
    runtime: 'nodejs12.x',
    apiGateway: {
      minimumCompressionSize: 1024,
    },
    environment: {
      AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1',
    },
  },
  functions: {
    hello: {
      handler: 'handler.hello',
      events: [
        {
          http: {
            method: 'get',
            path: '/documents',
          }
        },
        {
          http: {
            method: 'post',
            path: '/documents',
          }
        }
      ]
    }
  }
}

module.exports = serverlessConfiguration;
代码语言:javascript
复制
//ormconfig.json
{
   "type": "postgres",
   "host": "localhost",
   "port": 5432,
   "username": "root",
   "password": "password",
   "database": "myService",
   "synchronize": true,
   "logging": true,
   "uuidExtension": true,
   "keepConnectionAlive": true,
   "entities": [
      "src/entity/**/*.ts"
   ],
   "migrations": [
      "src/migration/**/*.ts"
   ],
   "subscribers": [
      "src/subscriber/**/*.ts"
   ],
   "cli": {
      "entitiesDir": "src/entity",
      "migrationsDir": "src/migration",
      "subscribersDir": "src/subscriber"
   }
}
代码语言:javascript
复制
//handler.ts
import "reflect-metadata";
import { createServer, proxy } from 'aws-serverless-express';
import { Context } from 'aws-lambda';
import { configureApp } from './app';

const binaryMimeTypes: string[] = [
  'application/json'
];
const app = configureApp();
const server = createServer(app, undefined, binaryMimeTypes);

export const hello = (event: any, context: Context) =>
  proxy(server, event, context);
代码语言:javascript
复制
//app.ts
import * as express from 'express';
import { json, urlencoded } from 'body-parser';
import * as cors from 'cors';
import { eventContext } from 'aws-serverless-express/middleware';
import {createConnection} from "typeorm";
import {Routes} from "./src/routes/routes"
import {Request, Response} from "express";
import * as bodyParser from "body-parser";

export function configureApp() {
  const app = express();

  createConnection().then(async connection => {

    app.use(cors());
    app.use(json());
    app.use(urlencoded({ extended: true }));
    app.use(eventContext());

    // create express app
    app.use(bodyParser.json());
  
    // register express routes from defined application routes
    Routes.forEach(route => {
        (app as any)[route.method](route.route, (req: Request, res: Response, next: Function) => {
            const result = (new (route.controller as any))[route.action](req, res, next);
            if (result instanceof Promise) {
                result.then(result => result !== null && result !== undefined ? res.send(result) : undefined);
  
            } else if (result !== null && result !== undefined) {
                res.json(result);
            }
        });
    });

    if (!connection.isConnected) {
      connection = await connection.connect();
    }

  }).catch(error => console.log(error));
  

  return app;
}
代码语言:javascript
复制
//./src/routes/routes
import {DocumentController} from "../controller/DosumentsController";

export const Routes = [{
    method: "get",
    route: "/documents",
    controller: DocumentController,
    action: "all"
}, {
    method: "get",
    route: "/documents/:id",
    controller: DocumentController,
    action: "one"
}, {
    method: "post",
    route: "/documents",
    controller: DocumentController,
    action: "save"
}];
EN

回答 1

Stack Overflow用户

发布于 2021-02-06 02:12:01

我实际上遇到了同样的问题,我花了很长时间才解决。问题是您需要在每次lambda调用开始时初始化数据库。在本例中,您的configureApp方法返回一个promise,在启动服务器之前不会等待它。

我不完全确定使用无服务器AWS的解决方案,但您应该能够这样做:

代码语言:javascript
复制
export const hello = async (event: any, context: Context) => {
  const app = await configureApp()
  const server = createServer(app, undefined, binaryMimeTypes);
  proxy(server, event, context);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65469201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档