使用 Express 的 Lambda 函数是否会为每个请求重新加载它的中间件?
Will a Lambda function using Express reload it's middleware for each request?
TLDR: app.use
调用的中间件是否会针对 Express 中的每个单独请求重新计算?
我有一个 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 函数 "goes to sleep" 时,此代码都会 运行?我的意思是,如果 Lambda 函数经常被 ping 并且再也不会闲置,那么每个请求都会有发出第一个请求的用户,是否会出现错误?或者中间件是否为每个单独的请求计算?
此中间件将 运行 响应每个请求,这与 Lambda 无关。一旦请求到达您的 Express-based Lambda 函数,它就会充当常规的 Express 服务器。
中间件的职责是拦截每个 HTTP 调用,无论它在何处 运行ning。
我在这里看到的唯一一件事是将 const cognito = new AWS.CognitoIdentityServiceProvider();
的声明移出中间件的范围,因此只要容器存在,就会缓存此对象的实例。这样做您将获得几微秒的时间(这可能无关紧要,但确实是一个很好的做法)。
您必须记住,由于 Node.js 中的模块是单例,因此 "global" 范围内的任何 required/declared(例如,在给定函数之外)都将是re-used 以后调用同一个 运行ning 容器。使用它对你有利,但也要小心无意中缓存你不想缓存的东西。
TLDR: app.use
调用的中间件是否会针对 Express 中的每个单独请求重新计算?
我有一个 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 函数 "goes to sleep" 时,此代码都会 运行?我的意思是,如果 Lambda 函数经常被 ping 并且再也不会闲置,那么每个请求都会有发出第一个请求的用户,是否会出现错误?或者中间件是否为每个单独的请求计算?
此中间件将 运行 响应每个请求,这与 Lambda 无关。一旦请求到达您的 Express-based Lambda 函数,它就会充当常规的 Express 服务器。
中间件的职责是拦截每个 HTTP 调用,无论它在何处 运行ning。
我在这里看到的唯一一件事是将 const cognito = new AWS.CognitoIdentityServiceProvider();
的声明移出中间件的范围,因此只要容器存在,就会缓存此对象的实例。这样做您将获得几微秒的时间(这可能无关紧要,但确实是一个很好的做法)。
您必须记住,由于 Node.js 中的模块是单例,因此 "global" 范围内的任何 required/declared(例如,在给定函数之外)都将是re-used 以后调用同一个 运行ning 容器。使用它对你有利,但也要小心无意中缓存你不想缓存的东西。