繁体   English   中英

在没有 API 网关的 lambda 函数中路由

[英]Routing in a lambda function without API Gateway

我有一个快速应用程序,并通过无服务器部署。 我的堆栈只是一个 lambda 函数 + API 网关。 这有效并且可以在 Postman 或 httpxmlrequest 上访问。 但是,如果我从堆栈中取出 API Gateway 部分,是否仍然可以使用 AWS SDK/cli 调用此 lambda 函数,通过传入path (eg: /books)method (eg: POST)以某种方式进行路由连同有效载荷?

我是 AWS 生态系统的新手……刚开始使用无服务器 + 节点。

假设我有一个简单的 Express 应用程序,如下所示:

const serverless = require('serverless-http');
const express = require('express');
const bodyParser = require('body-parser');

const helpersRoute = require('./routes');
const booksRoute = require('./routes/books');

const app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.use('/', helpersRoute);
app.use('/books', booksRoute);

module.exports.handler = serverless(app);

这是我的无服务器配置:

service: service-test

provider:
  name: aws
  runtime: nodejs8.10
  stage: dev

functions:
  app:
    handler: index.handler

是的,可以使用 Lambda SDK。 但是,由于您在 express 服务器后面运行您的函数,因此您必须传递一个与 API Gateway 完全一样的事件,因此,从调用的 Lambda 的角度来看,它只是一个 API Gateway 的调用。

您可以查看文档以查看 API 网关事件是什么样的,但本质上,您只需要路径正文(在 POST、PUT、PATCH 的情况下)请求 如果您需要查询参数等,您也可以传递它们。

确保将InvocationType设置为RequestResponse

这是Node.js的一个示例:

const lambda = new AWS.Lambda();

await lambda
    .invoke({
      FunctionName: 'FunctionName',
      InvocationType: 'RequestResponse',
      Payload: JSON.stringify({
        path: '/your_path',
      }),
    })
    .promise();

编辑: OP 在数据从给定 Lambda 函数到基于 Express 的 Lambda 函数的方式方面存在问题,因此我决定添加自己的配置以进行比较:

const serverless = require('serverless-http');
const express = require('express');
const cors = require('cors');

const app = express();
const bodyParser = require('body-parser');
const routes = require('./routes');

app.use(cors());

app.use(bodyParser.json({ strict: false }));

app.use('/api', routes);

module.exports.handler = serverless(app);

示例控制器方法:

const fetchOne = async (req, res) =>
  res
    .status(200)
    .json(await MyService.doSomething(req.body.someField));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM