我有一个快速应用程序,通过无服务器部署。我的堆栈只是一个lambda函数+ API网关。这是有效的,可以在Postman或httpxmlrequest上访问。但是,如果我从堆栈中取出 API 网关部分,是否仍然可以使用 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
是的,可以使用 Lambda 开发工具包。但是,由于您在快速服务器后面运行函数,因此您必须传递一个看起来与 API 网关完全相同的事件,因此,从调用的 Lambda 的角度来看,它只是 API 网关的调用。
您可以查看文档以查看 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));