gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:21:50 24 4
gpt4 key购买 nike

我目前正在构建一个基于 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com