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

时间:2019-07-10 09:51:25

标签: node.js express aws-lambda serverless

我有一个快速应用程序,并且通过无服务器部署。我的堆栈只是一个lambda函数+ API网关。那行得通,可以在Postman或httpxmlrequest上访问。但是,如果我从堆栈中取出API Gateway,仍然可以使用AWS开发工具包/ cli调用此lambda函数,则通过将path (eg: /books)method (eg: POST)与有效载荷?

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

说我有一个像这样的简单快递应用程序:

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

1 个答案:

答案 0 :(得分:1)

是的,可以使用Lambda SDK。不过,由于您是在快速服务器后运行功能,因此您必须传递一个看起来与API Gateway完全相同的事件,因此,从调用的Lambda角度来看,这只是API Gateway的调用。

您可以检查docs来查看API网关事件的外观,但是从本质上讲,您只需要 path body(对于POST,PUT,补丁)。如果您需要查询参数等,也可以将其传递。

确保将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));