node.js - 使用 Express 作为 AWS Lambda 的 RESTful 网关

标签 node.js express aws-lambda

我目前正在构建一个基于 AWS lambda 函数构建的应用程序,并且希望使用 Express 作为请求的中间件和网关,然后将其传递给 lambda。

但是,我想知道我的以下设置是否存在任何风险。基本上,我定义了所有可接受的路由,使用 router.all('/*') 捕获每个请求,然后如果请求的路由位于路由对象中并且请求的方法正确,它将对用户进行身份验证,然后运行 ​​lambda 函数。我还将添加身份验证逻辑、将哪些数据发送到 lambda 等。

我的问题是:

  1. 是否可以将 res 对象传递给 lambda 执行函数?
  2. 在不同的地方进行身份验证会更好,还是在 router.all 函数中进行身份验证更好?
  3. 使用这个简单的框架对可扩展性/处理许多请求有任何担忧吗?

    const express        = require('express');
    const app            = express();
    var AWS = require('aws-sdk');
    
    var router = express.Router();
    
    const routes = {
    'lambdaFunctionA': { 'method' : 'POST', 'data' : 'body'},
    'lambdaFunctionB': {'method' : 'GET', 'data' : 'queryParams'},
    'lambdaFunctionC': {'method' : 'GET'}
    }
    
    router.all('/*', function (req, res) {
    
      const path = req.path.split('/')[1];
    
      if (path in routes) {
    
        if ( routes[path].method == req.method ) {
            //authentication logic here 
            //if authenticated, execute lambda
            executeLambda(path,someDataHere, res);
        }
        else
        {
            res.status(405).send('Method not allowed');
        }
      }
      else
      {
          res.status(404).send('Not found');
      }
    });
    
    app.use('/api', router);
    
    app.listen(8080);
    
    function executeLambda(functionName,payload, res) {
    
        var params = {
          FunctionName: functionName,
          Payload: payload
        };
    
        var lambda = new AWS.Lambda();      
        lambda.invoke(params, function (err, data) {
          if (err) {
            //need to handle errors here
            res.send(err.stack);
          } else {
            res.send(JSON.parse(data.Payload));
          }
        });
    }
    

最佳答案

为什么不使用express的内置功能来做到这一点而不是自己做呢?当 Express 内置时,无需发明自己的路由

function lambdaHandler(req, res){
    executeLambda(path, someDataHere, res);
}
function auth(next){
    //...Do auth stuff
   if(!auth) return next("router");
   next();
}
router.use(auth);
router.post("/lambdaFunctionA", lambdaHandler)
router.get("/lambdaFunctionB", lambdaHandler)
router.get("/lambdaFunctionC", lambdaHandler)

查找express middleware

这样你就可以让 Express 为你处理方法等,而不必自己处理。它还可以验证。

对于每个请求,它都会使用来自 router.use(auth) 的中间件在到达 lambdaHandler 之前进行身份验证

此外,将 res 传递给 lambda 处理程序也是完全可以的。它只是一个对象。

<小时/>

附注:

你见过AWS API Gateway吗? ?

它可以处理路由并使用 lambda,就像在您的用例中一样。无需管理自己的服务器。

关于node.js - 使用 Express 作为 AWS Lambda 的 RESTful 网关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49246558/

相关文章:

node.js - 如何在带有express-validator的验证链中使用bail()

node.js - 如何限制 MongoDB 中每分钟的用户操作?

express - 在快速服务器中提取 - 未定义提取

node.js - 在开发中设置从 Angular 向 NodeJS 发送 API 请求的服务器端口

aws-lambda - 如何跟踪 AWS Lambda 错误重试次数

javascript - AWS Cognito Admin 创建用户临时密码验证和重置

javascript - Node server.js 没有响应

javascript - 如何将 POST 表单数据转换为 JSON 对象

node.js - 在 Node.js 中表达方法重写

html - 无法加载资源(css/js)AWS Lambda Express Node