node.js - 在没有 API Gateway 的情况下在 lambda 函数中进行路由

标签 node.js express aws-lambda serverless

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

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

假设我有一个简单的 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 的调用。

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

确保将 InitationType 设置为 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);

Controller 方法示例:

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

关于node.js - 在没有 API Gateway 的情况下在 lambda 函数中进行路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56968055/

相关文章:

javascript - Node.js 中的 Webscraper 返回带有 async 和 Promise 的空数组

javascript - express.js 路由中的参数类型

amazon-web-services - 我可以将参数传递到与 AWS API Gateway 的 WebSocket 连接吗?

java - AWS Lambda Java、S3 配置

node.js - 如果每 30 秒超过 1 个请求(进程在完成请求之前退出),则 Lambda 无法保持/删除请求(通过 API 网关)

javascript - Node 是否内置了对 Websockets 的支持?

javascript - 在多个类之间共享实例化变量的最佳方式?

javascript - Node js 需要代码而不是文件

node.js - 如何检查我的 pm2 应用程序 NODE_ENV 是否已设置?

node.js - 如何在 Node.js/Express.js 中将中间件放入它自己的文件中