TLDR:是否会针对Express中的每个单独请求重新计算由app.use
调用的中间件?
我有一个Lambda函数,该函数使用以下函数作为中间件,以将用户注入每个请求中:
async function(req, res, next) {
try {
const IDP_REGEX = /.*\/.*,(.*)\/(.*):CognitoSignIn:(.*)/;
const authProvider =
req.apiGateway.event.requestContext.identity
.cognitoAuthenticationProvider;
const [, , , userId] = authProvider.match(IDP_REGEX);
const cognito = new AWS.CognitoIdentityServiceProvider();
const listUsersResponse = await cognito
.listUsers({
UserPoolId: process.env.AUTH_SAYM_USERPOOLID,
Filter: `sub = "${userId}"`,
Limit: 1,
})
.promise();
const user = listUsersResponse.Users[0];
req.user = user;
next();
} catch (error) {
console.log(error);
next(error);
}
}
我的问题是:该中间件是否会为每个用户运行一次?还是仅在Lambda函数“进入睡眠”时才运行此代码?我的意思是,如果Lambda函数经常被ping通并且再也不会变得空闲,以至于每个请求都将拥有发出第一个请求的用户,那将会有一个错误吗?还是中间件为每个单独的请求计算?
答案 0 :(得分:1)
该中间件将在每次请求时运行,并且与Lambda无关。一旦请求到达基于Express的Lambda函数,它将用作常规的Express服务器。
中间件的职责是拦截每个HTTP调用,而不管它在哪里运行。
我在这里看到的唯一一件事是将const cognito = new AWS.CognitoIdentityServiceProvider();
的声明移出中间件的范围,因此该对象的实例将在容器存在的时间内被缓存。这样您将获得几微秒的时间(这可能无关紧要,但这确实是一个好习惯)。
您必须记住,由于Node.js中的模块是单例,因此在“全局”作用域(例如,给定函数之外)中需要/声明的所有内容都将在以后的调用中重新使用。相同的运行容器。使用此功能对您有利,但也请小心不要意外地缓存不需要的内容。