使用Express的Lambda函数是否会针对每个请求重新加载其中间件?

时间:2019-07-15 07:58:36

标签: node.js express aws-lambda middleware

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通并且再也不会变得空闲,以至于每个请求都将拥有发出第一个请求的用户,那将会有一个错误吗?还是中间件为每个单独的请求计算?

1 个答案:

答案 0 :(得分:1)

该中间件将在每次请求时运行,并且与Lambda无关。一旦请求到达基于Express的Lambda函数,它将用作常规的Express服务器。

中间件的职责是拦截每个HTTP调用,而不管它在哪里运行。

我在这里看到的唯一一件事是将const cognito = new AWS.CognitoIdentityServiceProvider();的声明移出中间件的范围,因此该对象的实例将在容器存在的时间内被缓存。这样您将获得几微秒的时间(这可能无关紧要,但这确实是一个好习惯)。

您必须记住,由于Node.js中的模块是单例,因此在“全局”作用域(例如,给定函数之外)中需要/声明的所有内容都将在以后的调用中重新使用。相同的运行容器。使用此功能对您有利,但也请小心不要意外地缓存不需要的内容。