node.js - 使用 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
aka 中有异步功能。在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;
};
推荐阅读
- node.js - 如何在 Heroku 的生产模式下修复 mongo db 问题?
- c# - 使用 WinSCP 计算远程 SFTP 文件夹中的文件
- c++ - 指针似乎在递归算法中迷路了
- javascript - 我需要将博客文章分块发送到谷歌翻译并返回
- puppeteer-sharp - PupeteerSharp - 如何确定元素类型
- azure - 将 Azure 函数的调用限制为门户和计时器
- audio - windows 10下ffmpeg无法抓取通过扬声器播放的音频
- guidewire - 实体上的 eti 默认值
- ios - 导航说明期间正在暂停音频播放
- mysql - laravel 如何管理 DB Query 中的多个 union