使用 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 容器。使用它对你有利,但也要小心无意中缓存你不想缓存的东西。