繁体   English   中英

使用AWS Lambda(TypeError)的Express函数中的异步中间件

[英]Async middleware in a express function with AWS Lambda (TypeError)

我想在我的中间件中使用一个async函数来提取我的AWS Lambda函数中的用户。

这是代码:

const bodyParser = require('body-parser');
const awsServerlessExpressMiddleware = require('aws-serverless-express/middleware');
const AWS = require('aws-sdk');

const asyncHandler = fn => (req, res, next) =>
  Promise.resolve(fn(req, res, next)).catch(next);

const pipe = (...fns) => x => fns.reduce((y, f) => f(y), x);
const tapRoute = f => route => {
  route.use(f);
  return route;
};

const configureCors = route => {
  route.use(function(req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header(
      'Access-Control-Allow-Headers',
      'Origin, X-Requested-With, Content-Type, Accept'
    );
    next();
  });
};
const injectUser = route => {
  route.use(async function(req, res, next) {
    try {
      const IDP_REGEX = /.*\/.*,(.*)\/(.*):CognitoSignIn:(.*)/;
      const authProvider =
        req.apiGateway.event.requestContext.identity
          .cognitoAuthenticationProvider;
      const [, , , userId] = authProvider.match(IDP_REGEX);
      console.log(userId);
      console.log('Got user id');

      const cognito = new AWS.CognitoIdentityServiceProvider();
      const listUsersResponse = await cognito
        .listUsers({
          UserPoolId: process.env.AUTH_LAMBDAUSERB2E6BC69_USERPOOLID,
          Filter: `sub = "${userId}"`,
          Limit: 1,
        })
        .promise();
      console.log('ListedUsers');
      const user = listUsersResponse.Users[0];
      req.user = user;
      next();
    } catch (error) {
      console.log(error);
      next(error);
    } finally {
      return route;
    }
  });
};

const applyMiddleware = (route, ...middleware) =>
  pipe(
    tapRoute(bodyParser.json()),
    tapRoute(awsServerlessExpressMiddleware.eventContext()),
    configureCors,
    injectUser,
    ...middleware
  )(route);

module.exports = {
  applyMiddleware,
};

代码在此行中引发错误:

route.use(async function(req, res, next) {

这是错误:

module initialization error: TypeError
at injectUser (/var/task/middleware.js:25:9)
at fns.reduce (/var/task/middleware.js:8:52)
at Array.reduce (<anonymous>)
at x (/var/task/middleware.js:8:35)
at applyMiddleware (/var/task/middleware.js:63:4)
at Object.<anonymous> (/var/task/app.js:13:1)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)

通常,我以后使用这种中间件是这样的:

const express = require('express');
const applyMiddleware = require('./middleware').applyMiddleware;

const app = express();
applyMiddleware(app);

app.get( // ... rest of the code

但是有时我还会在每个路由的基础上注入中间件。

到底是怎么回事? 为什么会引发此TypeError? 有什么方法可以使用将用户注入管道的异步中间件,从而减少样板? 如果我注释掉injectUser则中间件可以工作...

编辑:

使用app.use(async function // ...可以,但是我想在我的pipe也有async函数,即applyMiddleware

问题是您的configureCors函数。 您不在那里返回任何内容,因此链断开了, injectUser得到了undefined route变量。 应该像下面这样更新

const configureCors = route => {
  route.use(function(req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header(
      'Access-Control-Allow-Headers',
      'Origin, X-Requested-With, Content-Type, Accept'
    );
    next();

  });
  return route;
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM