我目前正在构建一个基于 AWS lambda 函数构建的应用程序,并且希望使用 Express 作为请求的中间件和网关,然后将其传递给 lambda。
但是,我想知道我的以下设置是否存在任何风险。基本上,我定义了所有可接受的路由,使用 router.all('/*') 捕获每个请求,然后如果请求的路由位于路由对象中并且请求的方法正确,它将对用户进行身份验证,然后运行 lambda 函数。我还将添加身份验证逻辑、将哪些数据发送到 lambda 等。
我的问题是:
- 是否可以将 res 对象传递给 lambda 执行函数?
- 在不同的地方进行身份验证会更好,还是在 router.all 函数中进行身份验证更好?
使用这个简单的框架对可扩展性/处理许多请求有任何担忧吗?
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 为你处理方法等,而不必自己处理。它还可以验证。
对于每个请求,它都会使用来自 router.use(auth) 的中间件在到达 lambdaHandler 之前进行身份验证
此外,将 res
传递给 lambda 处理程序也是完全可以的。它只是一个对象。
附注:
你见过AWS API Gateway吗? ?
它可以处理路由并使用 lambda,就像在您的用例中一样。无需管理自己的服务器。
关于node.js - 使用 Express 作为 AWS Lambda 的 RESTful 网关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49246558/