我目前正在构建一个基于AWS lambda函数构建的应用程序,并希望将Express用作请求的中间件和网关,然后将其传递给lambda。
但是,我想知道下面的设置是否有任何风险。基本上,我定义了所有可接受的路由,使用router.all('/ *')来捕获每个请求,然后如果请求的路由在routes对象中并且请求的方法是正确的,它将验证用户然后运行lambda函数。我还将添加用于身份验证的逻辑,将数据发送到lambda等。
我的问题是:
使用这个简单的框架对许多请求的可伸缩性/处理有任何顾虑吗?
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));
}
});
}
答案 0 :(得分:2)
为什么不使用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吗?
它可以像处理用例一样处理路由并使用lambdas。无需管理自己的服务器。